3

子类继承没有析构函数的父类(只有编译器生成的默认值)是一个糟糕的设计吗?有些书声称它不好,但没有提到在什么情况下它会。

4

3 回答 3

4

通过指向没有虚拟析构函数的基类型的指针删除派生类型的对象是未定义的行为。如果您希望这样做,通常如果您希望您的类被扩展,您应该提供一个virtual析构函数。

 struct A
 {};
 struct B : A
 {}

 //...
 A* a = new B;
 delete a;       //undefined behaviour
于 2012-08-05T00:36:56.200 回答
1

如所问,这可能根本没有问题,不。但是您的主题行说“析构函数”,而您的问题说“构造函数”,所以我不确定您的意思。如果基类没有虚拟析构函数,那可能是个问题——基类析构函数最终可能不会被调用。因此,如果该类有任何非 POD 数据成员,那么这些数据成员可能不会在子类中正确销毁。

于 2012-08-05T00:32:42.707 回答
1

最好将析构函数设置为虚拟,因为这样您以后就不必担心它了。

当您以多态方式删除该类并且您的类析构函数不会运行时,从没有析构函数的类继承将导致未定义的行为。

我能想到你不希望你的析构函数是虚拟的唯一原因是当你不希望为该函数创建一个 vtable 时。

于 2012-08-05T00:36:42.737 回答