C++ 纯虚函数调用不会抛出运行时异常?[复制]

C++ pure virtual function call doesn't throw run-time exception? [duplicate]

提问人:Troskyvs 提问时间:6/19/2022 最后编辑:General GrievanceTroskyvs 更新时间:6/27/2022 访问量:336

问:

据说在C++构造函数中,只要对象还没有完成构造,就不应该调用虚函数,否则就会抛出“纯虚函数调用错误”。所以我试了一下:

#include<stdio.h>
class A{
    virtual void f() = 0;
};

class A1 : public A{
public:
    void f(){printf("virtual function");}
    A1(){f();}
};
int main(int argc, char const *argv[]){
    A1 a;
    return 0;
}

在 Windows 上使用 G++ 编译它,它可以工作并打印

virtual function

那么如何让我的程序抛出“纯虚函数调用”异常呢?

谢谢!

C++ 函数 调用 pure-virtual

评论

1赞 speed_of_light 6/19/2022
只是好奇......你能把这句话说到哪里来吗?“据说在C++构造函数中,只要对象还没有完成构造,就不应该调用虚函数,否则就会抛出'纯虚函数调用错误'。
0赞 273K 6/19/2022
据我所知,C++ 标准中没有这样的例外。这是 msvc 的诊断崩溃消息。请参阅 stackoverflow.com/questions/99552/...,它描述了何时可以出现此类消息。我会投票关闭该问题,作为此链接的副本。
1赞 AlexStepanov 6/19/2022
通往地狱的道路是由构造函数中的虚拟函数调用铺就的
0赞 alagner 6/19/2022
你可能弄错了规则。构造函数将调用继承最多的虚拟,直到被构造的类级别,但不会更深入。看这里: stackoverflow.com/a/45832805/4885321
0赞 Peter 6/19/2022
在构造函数中调用虚拟函数不会导致任何异常。您看到的行为(调用,因为这是 for class 的最派生版本)是正确的。A1::f()f()A1

答:

7赞 Remy Lebeau 6/19/2022 #1

您没有收到“纯虚拟方法调用”异常,因为未被调用。A::f()

A1的构造函数正在调用自己的方法,这在构造过程中是完全安全的。A1::f()A1

在构造函数中调用虚拟方法的问题与调用派生类方法的基类构造函数有关,该方法不起作用,因为正在构造的对象的派生部分尚不存在。

因此,要获得所需的异常,您需要调用 的构造函数而不是 的构造函数。f()AA1