在下面的示例中,b
是一种多态指针类型,其静态类型为Base*
,其动态类型为Derived*
struct Base
{
virtual void f();
};
struct Derived : Base
{
};
int main()
{
Base *b = new Derived();
// ...
delete b;
}
在没有虚拟析构函数的情况下删除b
会发生什么?
答案 0 :(得分:2)
在没有虚拟析构函数的情况下删除b会发生什么?
我们不知道。行为未定义。对于大多数实际情况,可能不会调用Derived
的析构函数,但不保证任何内容。
(强调我的)
在第一个替代(删除对象)中,如果是静态类型的 要删除的对象不同于其动态类型,静态 type应该是对象的动态类型的基类 删除和静态类型应具有虚拟析构函数或 行为未定义。
答案 1 :(得分:0)
实际上它取决于目标编译器和常见情况
delete b;
调用descructor函数用于b的类型,然后调用自由分配的内存。 因此,如果析构函数是虚拟的,则从虚拟表(~Derived)调用函数,但如果不是,则从类(~Base)调用函数。 预期结果:〜仅调用Base。