为多态基类声明virtual函数
C++明确指出:
当derived class 对象经由一个base class 指针被删除,而该base class 带着non-virtual 析构函数,其结果未有定义。
实际执行时通常发生的是对象的derived成分没有被销毁。
心得体会:
只有当class内含至少一个virtual函数,才为它声明virtual析构函数。
总结:
1.Polymorphic(带有多态性质的)base classes应该声明一个virutal析构函数。如果Class带有任何virtual函数,它就应该拥有一个virtual析构函数。
2.Classes的设计目的如果不是作为base classes使用,或不是为了具备多态性(polymorphically),就不该声明virtual析构函数。
/***************************
effectivre c++
改善程序与设计的55个具体做法
条款7:为多态基类声明virtual函数
---------小鱼号的代码日记--------------
****************************/
#include <QCoreApplication>
#include<iostream>
using namespace std;
class TimeKeeper
{
public:
TimeKeeper()
{
cout << "TimeKeeper()" <<endl;
}
/* Polymorphic(带有多态性质的)base classes应该声明一个virutal析构函数*/
virtual ~TimeKeeper()
{
cout << "~TimeKeeper()" <<endl;
}
};
class WaterClock :public TimeKeeper
{
public:
WaterClock()
{
cout << "WaterClock()" <<endl;
}
~WaterClock()
{
cout << "~WaterClock()" <<endl;
}
};
TimeKeeper* getTimeKeeper()
{
return new WaterClock();
}
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
TimeKeeper* ptk = getTimeKeeper();
delete ptk;
return a.exec();
}
1.png
网友评论