【问题标题】:Virtual Destructor C++ [duplicate]虚拟析构函数 C++ [重复]
【发布时间】: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


【解决方案1】:

从具有虚拟析构函数的类派生的所有类都隐式地具有虚拟析构函数。

这适用于类层次结构中的任何成员函数。

【讨论】:

  • 比方说,我们使用没有显式声明的虚拟 dtor 的 derived1 指针存储一个 derived3 对象。那么基类 dtor 会被 delete 调用吗?
  • @AndrewLavq 这个答案说“是”。
【解决方案2】:

一旦将函数声明为 virtual,它在所有派生类中隐式保留为 virtual

【讨论】:

  • 这不是只适用于析构函数吗?
  • 有趣,我不知道为什么我认为在派生类中的重写方法上省略 virtual 会密封该方法。
  • @Rotem 您仍然可以使用 final 关键字来封装方法。
  • 有点自以为是,离题了,但你认为在派生类的头文件中标记虚方法仍然被认为是一种好的做法吗?
  • @Rotem 没有。首选方法是用override 标记它们,这意味着virtual 确保已正确完成覆盖(例如,防止参数类型中的错误会创建一个新的、不相关的函数)。
猜你喜欢
  • 2017-01-27
  • 2011-08-12
  • 2020-07-06
  • 2012-10-24
  • 2017-08-13
  • 2012-09-21
  • 2012-04-18
  • 1970-01-01
  • 2015-12-30
相关资源
最近更新 更多