Why is destructor always declared virtual
本问题已经有最佳答案,请猛点这里访问。
Possible Duplicate:
When to use virtual destructors?
Virtual destructor and undefined behavior
我是C++和编程新手,我观察到析构函数总是声明为虚拟的。我能知道为什么吗?
提前谢谢
它并不总是声明为
1 2 3 4 5 6 | class A{ public: ~A(); }; //note: ~A() is not virtual class B : public A {}; A *pA = new B(); delete pA; //invokes undefined behavior, as ~A() is not declared virtual |
在这种情况下,需要使基类析构函数成为虚拟的:
1 2 3 4 5 6 | class A{ public: virtual ~A(); }; //note: ~A() is virtual class B : public A {}; A *pA = new B(); delete pA; //Well defined behavior, as ~A() is declared virtual |
在这种情况下,
它被声明为虚拟的,这样继承类将记住重写此方法以进行自己的清理。这对于防止内存泄漏很重要。
在继承方面,将析构函数设置为基类的虚拟析构函数是有意义的,这样当通过基类指针调用特定类的析构函数时,就可以释放适当的类对象。所以,它遵循继承的相反顺序。(子级到父级)
以下链接中给出了最佳描述
link
析构函数并不总是声明为
如果一个类打算用作
1 2 3 4 5 6 | class A {public: ~A() {} }; class B : public A {public: ~B() {}}; A *a = new B; delete a; |
最后一行不会做正确的事情,因为它不会调用
注意,这只对您打算从中派生的类以及那些您打算用户使用