【发布时间】:2016-03-28 21:54:33
【问题描述】:
假设我从一个带有“空”虚拟析构函数的类继承:
// base.h
class Base {
public:
// ...
virtual ~Base();
};
// base.cc
Base::~Base() {}
如果我不需要在派生类的析构函数中做任何显式工作,那么添加另一个像 bleow 这样的“空”有什么害处吗?
// derived.h
class Derived : public Base {
public:
// ...
~Derived() override;
};
// derived.cc
Derived::~Derived() {}
this question 的回答说不是必要,但是有什么害处吗?
【问题讨论】:
-
除了线外定义的成本,没有,没有什么坏处。
-
把总有一天不得不维护你的代码的程序员当作一个知道你住在哪里的杀人狂。而且不会有任何伤害。
-
如果我们忽略你的
~Derived造成的编译错误,不会有什么坏处。但话又说回来 -~Base也没有编译,所以至少它没有变得更糟。 -
也许担心的是 ~Base() 不会被调用,除非 ~Derived() 显式调用它(即类似于其他虚拟方法覆盖的工作方式)。如果是这样,请不要担心——无论如何都会调用所有析构函数,因此子类析构函数不可能“隐藏”基类析构函数,例如导致资源泄漏。
-
@KerrekSB 有趣的是,内联定义的成本更高。
标签: c++ inheritance destructor virtual-inheritance virtual-destructor