如果基类析构函数是虚拟的,是否需要派生类析构函数定义?

Sha*_*ain 4 c++ virtual-destructor

我正在尝试以下示例:

class base // base class
{
public:
    std::list<base*> values;
    base(){}
    void initialize(base *b) {
        values.push_front(b);
    }
    virtual ~base()
    {
        values.clear();
        cout<<"base called"<<endl;
    }
};

class derived : public base // derived class
{
public:
    ~derived(){
        cout<<"derived called"<<endl;
    }

};

int main()
{
    derived *d = new derived;
    base *b = new base;
    b->initialize(static_cast<base *>(d)); /* filling list */
    delete b;
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

Q.1)为什么不调用派生类的析构函数,就像我在执行的基类析构函数一样values.clear()

Q.2)如果基类析构函数是虚拟的,是否需要派生类析构函数定义?

Luc*_*ore 7

Q1.因为您没有删除类型的对象derived.你这样做delete b;,删除了一个base.你也应该打电话delete d;.

此外,您应指定负责内存管理的对象.您的设计容易出错.你最好使用智能指针来防止歧义.此外,为了按照您的预期行事,析构函数应该是:

virtual ~base()
{
    for ( int i = 0 ; i < values.size() ; i++ )
        delete values[i];
    values.clear();
    cout<<"base called"<<endl;
}
Run Code Online (Sandbox Code Playgroud)

当然,通过这种方法,它将是未定义的行为调用delete d;你的main.

Q2.不,这个定义不是必需的.