为什么我们没有义务实现纯虚拟析构函数?

时间:2016-11-14 12:24:08

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

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

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

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

问题:

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

  • 这意味着只要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;
}
  • 我知道如果动态分配,我应该添加子析构函数以释放内存。

1 个答案:

答案 0 :(得分:7)

  

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

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

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

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

那么,与虚拟析构器开始的交易是什么?它已经完成,以便编译器知道在遇到某个类的破坏时调用最底层的析构函数。因此破坏确实使用虚拟表,它只是在派生的析构函数完成后运行父类析构函数,因此它不是标准覆盖。

  

这是否意味着只要C ++默认为我们添加了四个成员函数:构造函数,复制构造函数,赋值和析构函数我们不需要在派生类中实现它?

没有完全理解这个问题,但无论如何,默认添加的方法不是纯虚拟的,而是可以在继承链的每个类中创建。