C++ 是否有任何损害,在压倒一个“的;“空的”;虚拟析构函数和另一个析构函数?

C++ 是否有任何损害,在压倒一个“的;“空的”;虚拟析构函数和另一个析构函数?,c++,inheritance,destructor,virtual-inheritance,virtual-destructor,C++,Inheritance,Destructor,Virtual Inheritance,Virtual Destructor,假设我从具有“空”虚拟析构函数的类继承: //base.h 阶级基础{ 公众: // ... 虚拟~Base(); }; //base.cc Base::~Base(){} 如果我不需要在派生类的析构函数中执行任何显式工作,那么添加另一个“空”析构函数(如bleow)有什么害处吗 // derived.h class Derived : public Base { public: // ... ~Derived() override; }; // derived.cc Derive

假设我从具有“空”虚拟析构函数的类继承:

//base.h
阶级基础{
公众:
// ...
虚拟~Base();
};
//base.cc
Base::~Base(){}
如果我不需要在派生类的析构函数中执行任何显式工作,那么添加另一个“空”析构函数(如bleow)有什么害处吗

// derived.h
class Derived : public Base {
 public:
  // ...
  ~Derived() override;
};

// derived.cc
Derived::~Derived() {}
答案是没有必要,但有什么害处吗

添加另一个像bleow这样的“空”有什么害处吗

// derived.h
class Derived : public Base {
 public:
  // ...
  ~Derived() override;
};

// derived.cc
Derived::~Derived() {}
派生的
构造函数内联的每个翻译单元都必须生成内联析构函数的一个脱机副本,以将其地址放入
派生的
的虚拟表中。链接器丢弃了重复的虚拟表,然而,析构函数的离线副本及其调试信息将保留下来


使析构函数越位可防止上述代码重复,并使您的目标文件、可执行文件和共享库更小。

除了越位定义的成本外,没有任何危害。请将某一天必须维护代码的程序员视为一个知道您住在哪里的杀人狂。如果我们忽略由您的
~派生的
引起的编译错误,那么就不会有任何危害。但话说回来,
~Base
也不会编译,所以至少不会变得更糟。可能担心的是,~Base()不会被调用,除非~Derived()显式调用它(即,类似于其他虚拟方法重写的工作方式)。如果是这样的话,不用担心——不管发生什么情况,所有的析构函数都会被调用,因此子类析构函数不可能“隐藏”基类析构函数,例如导致资源泄漏。@KerrekSB很有趣,内联定义的成本更高。@MatthieuM:过去20年中制造的几乎所有链接器都可以内联外联功能。@MooingDuck:是的,但有误导性。(1) 链接时间优化是选择性加入,一些大型库需要大量资源;(2)链接时间优化只解决包含定义的库的问题,而不是动态链接时的任何客户端的问题。