C++析构函数必须要用virtual修饰的原因
2017-01-11 15:41
155 查看
先举例: #include <iostream> using namespace std; class Father { public: int m_fMember; Father(){m_fMember=1;} ~Father(){cout<<m_fMember<<endl;} }; class Child : public Father{ public: int m_cMember; Child(){m_cMember=2;} ~Child(){cout<<m_cMember<<endl;} }; int main(int argc, char** argv) { Father* pObj1 = new Child(); delete pObj1; cout<<"--"<<endl; Child* pObj2 = new Child(); delete pObj2; return 0; } 运行结果: 1 -- 2 1 如果不用virtual函数,是没有执行期绑定一说的,比如pObj1这个指针,其实它是Child对象,但是在释放时,~Child()方法并没有被调用,仅调用了~Father方法。为什么呢?因为没有用virtual,就是编译期绑定,当你在编译时gcc/g++只知道pObj1是个Father对象,所以在delete时就去调用Father的析构了。 而如果定义成virtual ~Father时,结果就是一定会析构Child,这就是为什么析构函数都要用virtual,因为没人知道会不会有子类继承,否则一旦继承,发生这样的事,析构函数里万一释放了些资源,比如SOCKET,比如memory,那就是资源泄露了。 |
相关文章推荐
- C++析构函数后加上virtual的原因
- C++将析构函数定义成virtual的真正原因
- C++ 析构函数 使用virtual的原因
- c++如果定义了析构函数,则必须有析构函数的函数体,那怕是空的也行,如果没有定义析构函数,则会调用默认的析构函数
- C++ 里virtual对析构函数的影响
- C++中构造函数和析构函数(virtual)的执行顺序
- 多态基类的析构函数必须加上virtual
- 为什么必须实现虚析构函数 ,纯虚析构函数的原因
- C++中析构函数定义成虚函数的原因
- C++学习笔记25,永远将析构函数声明为virtual
- C++中析构函数定义成虚函数的原因
- C++中构造函数和析构函数(virtual)的执行顺序
- C++构造函数和析构函数是否可以为virtual?
- [C++基础]023_为什么要将基类的析构函数声明为Virtual?
- [C++]把析构函数声明为virtual有什么好处?
- C++中基类的析构函数为什么要用virtual虚析构函数
- 析构函数(Virtual)的原因
- 析构函数,必须是virtual的,否则会内存泄漏
- 有继承的C++析构函数一定要用virtual
- C++中析构函数需要定义成虚函数的原因