没有虚拟析构函数的C ++继承

时间:2013-10-12 22:42:49

标签: c++ inheritance

如果父类的析构函数不是虚拟的,但子类没有其他成员,那么使用父类的析构函数是否安全?

class A{
    ~A();
    protected:
        int i;
};
class B: public A{

}

A *x = new B; delete x;

3 个答案:

答案 0 :(得分:3)

简短的回答是不,这是不安全的。

答案 1 :(得分:3)

根据§5.3.5

,这是不安全的,它是未定义的行为
  

5.3.5删除[expr.delete]

     

3 在第一个备选(删除对象)中,如果要删除的对象的静态类型与其动态类型不同,则静态类型应为动态类型的基类。要删除的对象和静态类型应具有虚拟析构函数或行为未定义。在第二种方法(删除数组)中,如果要删除的对象的动态类型与其静态类型不同,则行为是未定义的。

为什么它可能会破坏的一个例子是:

class A
{
public:
    ~A();
protected:
    int i;
};

class B: public A
{
    virtual void dummy();
}

A *x = new B; delete x;

现在B有一个vtbl,因此对象布局不同。

BTW:public class A是Java或其他语言,但不是C ++。

答案 2 :(得分:0)

为何冒风险?

确保基类被破坏的几个字节也不是那么重要。

也可以防止内存泄漏。