【问题标题】:why we are not obliged to implement pure virtual destructor?为什么我们没有义务实现纯虚拟析构函数?
【发布时间】:2016-11-14 12:24:07
【问题描述】:

使类抽象是通过使其成员函数之一成为纯虚函数。

使类抽象强制该类的子类实现基本纯虚函数。

我们甚至可以将基类析构函数变成纯的,这足以成为抽象类。

问题:

  • 为什么我们没有义务在派生类中实现纯虚基的析构函数?

  • 是不是说只要C++默认给我们增加了四个成员函数:构造函数、复制构造函数、赋值和析构函数就不需要在我们的派生类中实现了吗?

例如:

#include <iostream>
using namespace std;

class Base
{
    public:
        Base(){cout << "Base Ctor" << endl;}
        virtual ~Base() = 0 {cout << "Virtual base dtor" << endl; }
};

class Derived : public Base
{
    public:
        Derived(){cout << "Derived Ctor" << endl;}
         // virtual ~Derived() {cout << "Virtual Derived dtor" << endl; }
};

int main()
{

    Base* theBase = new Derived;
    delete theBase;

    cout << endl;


    cout << endl << endl;
    return 0;
}
  • 我知道如果它是动态分配的,我应该添加子析构函数来释放内存。

【问题讨论】:

  • 嗯,本质上是因为为派生类自动生成了一个析构函数。然而,通过创建一个纯虚析构函数,你的类变成抽象的并且不可能创建该类型的对象(例如,new Base; 不会编译)。

标签: c++ oop pure-virtual virtual-destructor


【解决方案1】:

为什么我们没有义务在派生类中实现纯虚基的析构函数?

因为析构函数没有被覆盖。

为了帮助记住这一点,请考虑一下名称:~Base~Derived 不一样。构造函数和析构函数不是通过重写工作,而是在链中调用:最底层的析构函数运行,然后调用其父析构函数,父析构函数运行,然后调用其父析构函数等。

这就是为什么你必须为析构函数提供主体,如果你想删除一个派生类的实例,即使它被标记为纯虚拟:它需要一个主体来调用在析构链中到达它时。

那么,虚拟析构函数是怎么开始的呢?这样做是为了让编译器在遇到某个类的破坏时知道调用最底层的析构函数。所以销毁确实使用了虚拟表,只是在派生析构函数完成后它在运行父类析构函数,所以它不是标准覆盖。

是不是说只要C++默认给我们增加了四个成员函数:构造函数、拷贝构造函数、赋值和析构函数就不需要在我们的派生类中实现了吗?

不太明白这个问题,但无论如何默认添加的方法都不是纯虚拟创建的,可以在继承链中的每个类中创建。

【讨论】:

    猜你喜欢
    • 2021-12-09
    • 2014-02-02
    • 1970-01-01
    • 2010-11-16
    • 2014-08-05
    • 1970-01-01
    • 2010-12-11
    • 2014-02-12
    相关资源
    最近更新 更多