我发现Peter Sommerlads 幻灯片(p.32)中也提到的零规则非常引人注目。
虽然,我似乎记得有一个严格的规则,即必须定义析构函数 virtual,如果该类具有虚拟成员并且实际上是派生的。
struct Base {
virtual void drawYourself();
virtual ~Base() {}
};
struct Derived : public Base {
virtual void drawYourself();
};
析构函数的主体甚至可能是空的(它只需要 vtbl 中的条目)。
我似乎记得在使用层次结构时
int main() {
Base *obj = new Derived{};
obj->drawYourself(); // virtual call to Derived::drawYourself()
delete obj; // Derived::~Derived() _must_ be called
}
那么delete obj
调用正确的析构函数很重要。是否正确,如果我完全省略了析构函数定义,它就不会变成 virtual,因此会调用错误的 d'tor 吗?
struct Base {
virtual void drawYourself();
// no virtual destructor!
};
这引出了我的最后一个问题:
- “零规则”在具有虚拟方法的层次结构中是否也适用
- 还是在这些情况下我需要定义虚拟析构函数?
编辑:正如我在回答中被提醒的那样,我的 1sr 版本的问题有错误的假设。相关的(虚拟)析构函数是 in Base
,而不是Derived
。但我的问题是:我是否需要声明(虚拟)析构函数?