以下哪种情况需要虚拟析构函数?

时间:2015-04-03 16:47:50

标签: c++

案例-1:

基类有一个动态分配的变量,但派生类不是,然后我这样做:

Base* p = new Derived;
delete p;

案例-2:

base和derived类都有动态分配的变量(派生除了继承的变量之外还有其他动态分配的变量)。 我再说一次:

Base* p = new Derived;
delete p;

案例-3: 基类没有动态分配的变量,但派生的变量没有。我再次这样做:

Base* p = new Derived;
delete p;

案例4:基类和派生类都没有动态分配的变量。我再说一次:

Base* p = new Derived;
delete p;

如果忽略虚拟关键字,它是否会在所有情况下导致未定义的行为?

1 个答案:

答案 0 :(得分:4)

所有这些。

如果delete使用的指针与实际对象的类型不同,编译器除非析构函数是虚拟的,否则不知道如何正确执行。此时您将获得未定义的行为,即使它似乎正常工作。