关于C++:为什么析构函数总是声明为虚函数

Why is destructor always declared virtual

本问题已经有最佳答案,请猛点这里访问。

Possible Duplicate:
When to use virtual destructors?
Virtual destructor and undefined behavior

我是C++和编程新手,我观察到析构函数总是声明为虚拟的。我能知道为什么吗?

提前谢谢


它并不总是声明为virtual。当要通过一个类型为基类的指针来delete一个对象时,它被声明为虚拟的,然后需要使基类的析构函数成为虚拟的,以避免未定义的行为。

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

在这种情况下,delete pA首先调用~B()(因为pA指向B类型的对象),然后调用~A()


它被声明为虚拟的,这样继承类将记住重写此方法以进行自己的清理。这对于防止内存泄漏很重要。


在继承方面,将析构函数设置为基类的虚拟析构函数是有意义的,这样当通过基类指针调用特定类的析构函数时,就可以释放适当的类对象。所以,它遵循继承的相反顺序。(子级到父级)


以下链接中给出了最佳描述
link


析构函数并不总是声明为virtual

如果一个类打算用作public基类,则virtual析构函数很重要。如果没有virtual析构函数,以下内容将无法工作:

1
2
3
4
5
6
class A {public: ~A() {} };

class B : public A {public: ~B() {}};

A *a = new B;
delete a;

最后一行不会做正确的事情,因为它不会调用B的析构函数。为了纠正这个问题,A的析构函数必须是virtual

注意,这只对您打算从中派生的类以及那些您打算用户使用public继承的类是必要的。对于大多数类来说,情况通常不是这样。