并不是所有的类都要定义虚的析构函数.因为在C++中引入虚函数是有代价的.
只要当你需要通过delete ptr删除一个对象的时候,你才需要定义虚的析构函数.
看下面的代码段:
class Base{ public: Base(int i):m(i){} virtual void doSomeThing()=0; private: int m; }; class Derived:public Base{ public: Derived(int v):Base(v){} void doSomeThing(){ } }; int main(){ Derived* d = new Derived(11); d->doSomeThing(); delete d; }
一切都工作得很好,直到有一天,你学习了设计模式,明白我们要面向接口编程,而不是面向实现编程.于是代码改成这样:
int main(){ Base* d = new Derived(11); d->doSomeThing(); delete d; }
于是问题来了,delete的时候是要调用析构函数的,可是我们的析构函数不是虚函数,于是只会调用Base的析构函数
这样派生类就析构不完全,程序里隐含了bug.
时间: 2024-10-21 15:36:45