我们知道,基类析构函数被标记为虚拟的,可以正确破坏派生类实例作为基类指针。那么下面的派生类析构函数实践之间有什么区别?
~Derived();
~Derived() override;
~Derived() override = default;
virtual ~Derived() override = default;
还有已知的最佳做法吗?
答案 0 :(得分:1)
入门:我们希望Baseclass::~Baseclass
是虚拟的,class Derived
是从Baseclass
公开派生的。
简单析构函数:如果没有其他类(并且永远不会)从Derived
派生,这就是您将要使用的基本方法。不要将所有析构函数都声明为虚拟的,而应按照2中的描述使用override
关键字。例外:您创建了一个分片库,并希望人们从您的库中安全地派生类。
具有重写的析构函数:如果您声明一个派生类并想调用它的基类析构函数,请使用override
。这样,如果您忘记将virtual
添加到基类描述符中,则会出现编译错误。
具有重写和默认析构函数的析构函数:如果忘记声明基类析构函数为虚拟的,则还会收到编译错误。如果您不需要执行特殊的清理任务(例如,释放HEAP分配的内存),请使用此选项。更好/更清洁,然后写~Derived() {}
所有内容的组合:嗯,声明虚构的析构函数并使用重写没有好处。无论如何,Override会将方法(在这种情况下为析构函数)声明为虚拟方法。请参阅:https://en.cppreference.com/w/cpp/language/override。因此与3相同。