EffictiveC++为多态基类声明virtual析构函数
2011-09-22 13:11
218 查看
假设有一个基类是车,子类分别为卡车、出租车、自行车。
当我们用工厂产生一个子类,并返回一个基类的指针指向它。
Car* pCar=createCar();
然后在用完的时候删除
delete pCar;
问题是:pCar是一个基类类型的指针,编译器把它指向的对象当作一个基类来调用析构函数去销毁。这样的话子类部分并没有清楚,造成了一个半销毁状态的情况。
解决办法是将基类的析构函数声明为virtual,当销毁的时候,将动态的调用你子类的析构函数。
书中P41说,一个类如果没有虚函数的话,表示他不想被作为基类是什么意思?
当然无端的为一个类声明虚函数是没必要的,也会因为vtbl占用存储空间。而当类中至少有一个虚函数的时候才为他生命一个虚析构函数。
所以这样的话,在stl中很多没有虚析构函数的容器就不能被继承。
因为继承之后,无意中将会把基类的部分给delete掉而留下了剩余的部分残缺子类。(释放指向子类的基类型指针,编译器只调用基类的析构函数,并不经过子类的析构函数。不幸的是c++木有C#java的final和sealed)
最后,用作多态目的的基类才有必要声明虚析构函数,否则是多此一举了。
当我们用工厂产生一个子类,并返回一个基类的指针指向它。
Car* pCar=createCar();
然后在用完的时候删除
delete pCar;
问题是:pCar是一个基类类型的指针,编译器把它指向的对象当作一个基类来调用析构函数去销毁。这样的话子类部分并没有清楚,造成了一个半销毁状态的情况。
解决办法是将基类的析构函数声明为virtual,当销毁的时候,将动态的调用你子类的析构函数。
书中P41说,一个类如果没有虚函数的话,表示他不想被作为基类是什么意思?
当然无端的为一个类声明虚函数是没必要的,也会因为vtbl占用存储空间。而当类中至少有一个虚函数的时候才为他生命一个虚析构函数。
所以这样的话,在stl中很多没有虚析构函数的容器就不能被继承。
因为继承之后,无意中将会把基类的部分给delete掉而留下了剩余的部分残缺子类。(释放指向子类的基类型指针,编译器只调用基类的析构函数,并不经过子类的析构函数。不幸的是c++木有C#java的final和sealed)
最后,用作多态目的的基类才有必要声明虚析构函数,否则是多此一举了。
相关文章推荐
- effective c++ 条款7,8(为多态基类声明virtual析构函数,别让异常逃离析构函数)
- Effective C++学习7 条款07:为多态基类声明virtual析构函数
- 为多态基类声明virtual析构函数
- 多态基类声明virtual析构函数
- effective C++ 读书笔记 条款07 为多态基类声明virtual析构函数
- effective c++(07)之为多态基类声明virtual析构函数
- 条款07:为多态基类声明virtual析构函数
- Effective C++(7) 为多态基类声明virtual析构函数 or Not
- 条款7:为多态基类声明virtual析构函数
- effective C++ 读后感(七)为多态基类声明virtual析构函数
- 为多态基类声明virtual析构函数
- Effective C++ 条款七 为多态基类声明virtual析构函数
- [Effective C++ --007]为多态基类声明virtual析构函数
- Effective c++学习笔记——条款07:为多态基类声明virtual析构函数
- Effective C++ 07:为多态基类声明virtual析构函数
- 《Effective C++》学习笔记条款07 为多态基类声明virtual析构函数
- 读书笔记_Effective_C++_条款七:为多态基类声明virtual析构函数
- effective c++条款07为多态基类声明为virtual析构函数
- (原文)Effective C++条款7:为多态基类声明VIRTUAL析构函数
- 条款:07 为多态基类声明virtual析构函数