您的位置:首页 > 编程语言 > C语言/C++

EffictiveC++为多态基类声明virtual析构函数

2011-09-22 13:11 218 查看
假设有一个基类是车,子类分别为卡车、出租车、自行车。

当我们用工厂产生一个子类,并返回一个基类的指针指向它。

Car* pCar=createCar();

然后在用完的时候删除

delete pCar;

问题是:pCar是一个基类类型的指针,编译器把它指向的对象当作一个基类来调用析构函数去销毁。这样的话子类部分并没有清楚,造成了一个半销毁状态的情况。

解决办法是将基类的析构函数声明为virtual,当销毁的时候,将动态的调用你子类的析构函数。

书中P41说,一个类如果没有虚函数的话,表示他不想被作为基类是什么意思?

当然无端的为一个类声明虚函数是没必要的,也会因为vtbl占用存储空间。而当类中至少有一个虚函数的时候才为他生命一个虚析构函数。

所以这样的话,在stl中很多没有虚析构函数的容器就不能被继承。

因为继承之后,无意中将会把基类的部分给delete掉而留下了剩余的部分残缺子类。(释放指向子类的基类型指针,编译器只调用基类的析构函数,并不经过子类的析构函数。不幸的是c++木有C#java的final和sealed)

最后,用作多态目的的基类才有必要声明虚析构函数,否则是多此一举了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: