案例-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;
如果忽略虚拟关键字,它是否会在所有情况下导致未定义的行为?
答案 0 :(得分:4)
所有这些。
如果delete
使用的指针与实际对象的类型不同,编译器除非析构函数是虚拟的,否则不知道如何正确执行。此时您将获得未定义的行为,即使它似乎正常工作。