在C++中,为什么有时析构函数必须写为虚函数
2014-12-14 18:55
399 查看
在C++中,为什么有时析构函数必须写为虚函数?如果这是必要的,那么为什么C++不把虚析构函数直接作为默认值?
回答:
编译器总是根据类型来调用类成员函数。但是一个派生类的指针可以安全地转化为一个基类的指针。这样删除一个基类的指针的时候,C++不管这个指针指向一个 基类对象还是一个派生类的对象,调用的都是基类的析构函数而不是派生类的。如果你依赖于派生类的析构函数的代码来释放资源,而没有重载析构函数,那么会有资源泄漏。
所以建议的方式是将析构函数声明为虚函数。如果你使用MFC,并且以CObject或其派生类为基类,那么MFC已经为你做了这件事情;CObject的析构函数是虚函数。一个函数一旦声明为虚函数,那么不管你是否加上virtual修饰符,它在所有派生类中都成为虚函数。但是由于理解明确起见,建议的方式还是加上virtual修饰符。
C++不 把虚析构函数直接作为默认值的原因是虚函数表的开销以及和C语言的类型的兼容性。有虚函数的对象总是在开始的位置包含一个隐含的虚函数表指针成员。如果是对于MFC类CPoint和CSize这样的小型类,增加一个指针就增加了很多内存占用,而且使得其内存表示和基类POINT和SIZE不一致。如果两个类的内存表示一致,那么这样你可以安全地把一个类的指针或数组当作另一个类的指针或数组使用。
回答:
编译器总是根据类型来调用类成员函数。但是一个派生类的指针可以安全地转化为一个基类的指针。这样删除一个基类的指针的时候,C++不管这个指针指向一个 基类对象还是一个派生类的对象,调用的都是基类的析构函数而不是派生类的。如果你依赖于派生类的析构函数的代码来释放资源,而没有重载析构函数,那么会有资源泄漏。
所以建议的方式是将析构函数声明为虚函数。如果你使用MFC,并且以CObject或其派生类为基类,那么MFC已经为你做了这件事情;CObject的析构函数是虚函数。一个函数一旦声明为虚函数,那么不管你是否加上virtual修饰符,它在所有派生类中都成为虚函数。但是由于理解明确起见,建议的方式还是加上virtual修饰符。
C++不 把虚析构函数直接作为默认值的原因是虚函数表的开销以及和C语言的类型的兼容性。有虚函数的对象总是在开始的位置包含一个隐含的虚函数表指针成员。如果是对于MFC类CPoint和CSize这样的小型类,增加一个指针就增加了很多内存占用,而且使得其内存表示和基类POINT和SIZE不一致。如果两个类的内存表示一致,那么这样你可以安全地把一个类的指针或数组当作另一个类的指针或数组使用。
相关文章推荐
- C++中为什么有时基类的析构函数必须写为虚函数
- c++的构造函数为什么不能是虚函数,而基类的析构函数必须是虚函数?
- c++ 为什么析构函数必须声明为虚函数
- C++中为什么析构函数可以是虚函数,而构造函数不可以是虚函数?
- C++中析构函数为什么是虚函数
- c++中析构函数为什么可以为虚函数?
- C++析构函数为什么要为虚函数
- C++中,为什么构造函数不能够是虚函数,而析构函数可以是虚函数,而且最好是虚函数
- C++基类的析构函数为什么设置成虚函数
- 为什么C++的构造函数不可以是虚函数,而析构函数可以是虚函数
- C++析构函数为什么要为虚函数
- C++析构函数为什么要为虚函数
- C++析构函数为什么要为虚函数
- C++析构函数为什么要为虚函数
- C++——析构函数为什么要为虚函数
- 为什么C++中父类的析构函数经常声明为虚函数 3ff8
- C++:析构函数写成虚函数是干什么用的,为什么要这么写?
- C++析构函数为什么要为虚函数 http://www.cnblogs.com/lixiaohui-ambition/archive/2012/07/13/2589716.html
- C++中为什么构造函数不能是虚函数,析构函数是虚函数
- C++析构函数为什么要为虚函数?