先举例:
#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修饰的原因
最新推荐文章于 2024-08-09 09:44:57 发布