作为通常的原则,如果一个类定义了虚函数,那么它的析构函数就应当是virtual的。因为定义了虚函数则隐含着:这个类会被继承,并且会通过基类的指针指向子类对象,从而得到多态性。 这个类可能会被继承,并且会通过基类的指针指向子类对象”,因此基类的析构函数是否为虚将决定子类的对象是否被析构 示例代码: #include <iostream.h>
struct A { virtual ~A() {cout<<"~A()/n";} }; struct B: public A { ~B() {cout<<"~B()/n";} }; void main() { A* p = new B; delete p; } 如果 A的析构函数不是virtual的,那么此时就不是先调用B的析构函数再调用A的析构函数。 不用virtual 的几种情况: 声明基类的析构函数为virtual并非总是为了防止memory leak 另外这也只是作为一般的原则(基类中有虚函数则把其析构函数声明为virtual)。如果你的析构函数什么事也不作,从效果上来说,不声明为virtual也无妨 |