这个问题在实践中偶然会遇到,设计一个TimeKeeper基类和一些派生类来记录时间:
1 class TimeKeeper
2 {
3 public:
4 TimeKeeper ();
5 ~TimeKeeper();
6
7 };
8
9 class AtomicClock: public TimeKeeper {}; //原子钟
10 class WaterClock: public TimeKeeper {}; //水钟
在利用时,我们大概会利用factory工场要领:
1 TimeKeeper* getTimeKeeper();//返回一个指针,指向一个派生类的动态分 配的工具
2
3 TimeKeeper* ptk = getTimeKeeper();//从担任体系中获得一 个动态分派工具
4
5 delete ptk;//认真的删除它
删除的时候就会呈现问题,因为ptk这个指针指向的是基类,那删除的指令会执行基类 TimeKeeper的析构函数,该函数不是virtual函数。
在c++中,这样的环境下其删除行为没有被界说,一般会只删除基类的身分,而派生类 的那些元素没有被删除,这就是形成资源泄露,松弛数据布局,在调试器上挥霍许多时间 的绝佳途径哦(引用原文翻译)。
办理的要领就是界说一个基类的virtual析构函数,这样一来,删除行为就会在派生类 中实现,不会只删除一部门。
一般来说,只要类中有virtual函数,就要界说一个virtual析构函数。不外,假如类 中没有virtual函数,就不需要也不该该界说virtual析构函数,这样不只没用,并且也会 增加特别开支,且会发生许多的兼容性问题,因为virtual机制是c++特有的。
别的,c++中许多类的实现都是不带virtual的,好比:string,STL中的vector,list ,set,trl::unordered_map,假如担任它们很大概呈现上述的错误,所以作者提醒各人 :拒绝担任尺度容器可能其它只有非virtual析构函数的类!