【发布时间】:2016-08-14 08:15:06
【问题描述】:
我知道,如果我们想调用派生对象的析构函数,该派生对象已分配给指向基的指针,我们希望将基析构函数设为虚拟。 但是,如果我们有这样的事情:
#include <iostream>
using namespace std;
class base
{
public:
base() { cout << "Base Constructor Called\n"; }
virtual ~base() { cout << "Base Destructor called\n"; }
};
class derived1 :public base
{
public:
derived1() { cout << "Derived1 constructor called\n"; }
~derived1() { cout << "Derived1 destructor called\n"; }
};
class derived2 : public derived1
{
public:
derived2() { cout << "Derived2 constructor called\n"; }
~derived2() { cout << "Derived2 destructor called\n"; }
};
class derived3 : public derived2
{
public:
derived3() { cout << "Derived3 constructor called\n"; }
~derived3() { cout << "Derived3 destructor called\n"; }
};
我们有这样的主要功能:
int main (){
base* ptr=new derived3;
delete ptr;
输出为:Base Constructor Called
Derived1 constructor called
Derived2 constructor called
Derived3 constructor called
Derived3 destructor called
Derived2 destructor called
Derived1 destructor called
Base Destructor called
这调用了 base、derived1、derived2 和 derived3 析构函数,它们工作得很好。我们只将基本析构函数设为虚拟。
为什么不需要将derived1 和derived2 析构函数设为virtual 来产生相同的结果?
【问题讨论】:
-
I posted this answer 就在几个小时前,引用了 C++ 规范中的引号,说明了为什么子类不需要它。最后一句是你应该读的。顺便说一下,all 成员函数也是如此,如果基类将其声明为虚拟,那么它在所有子类中也是虚拟的。
标签: c++ class virtual-destructor