使类抽象是通过使其成员函数之一成为纯虚函数。
使类抽象强制类的子类实现基本的纯虚函数。
我们甚至可以使基类析构函数变纯,这足以成为抽象类。
问题:
为什么我们没有义务在派生类中实现纯虚拟基础的析构函数?
这意味着只要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;
}
答案 0 :(得分:7)
为什么我们没有义务在派生类中实现纯虚拟基础的析构函数?
因为析构函数没有被覆盖。
为了帮助记住这一点,请考虑一下名称:~Base
和~Derived
不一样。构造函数和析构函数,而不是通过重写,而是在链中调用:最底层的析构函数运行,然后调用其父析构函数然后运行,然后调用其父析构函数等。
这就是为什么你必须提供析构函数的主体,如果你想要删除一个派生类的实例,即使它被标记为纯虚拟:它需要在析构函数链中到达它时调用的主体。
那么,与虚拟析构器开始的交易是什么?它已经完成,以便编译器知道在遇到某个类的破坏时调用最底层的析构函数。因此破坏确实使用虚拟表,它只是在派生的析构函数完成后运行父类析构函数,因此它不是标准覆盖。
这是否意味着只要C ++默认为我们添加了四个成员函数:构造函数,复制构造函数,赋值和析构函数我们不需要在派生类中实现它?
没有完全理解这个问题,但无论如何,默认添加的方法不是纯虚拟的,而是可以在继承链的每个类中创建。