为什么析构函数总是声明为虚拟

时间:2012-02-18 05:47:54

标签: c++ destructor

  

可能重复:
  When to use virtual destructors?
  Virtual destructor and undefined behavior

我是c ++和编程的新手,我观察到析构函数总是被声明为虚拟。 我可以知道为什么会这样吗?

先谢谢

5 个答案:

答案 0 :(得分:10)

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

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

在这种情况下,您需要使基类析构函数为virtual:

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()

答案 1 :(得分:4)

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

答案 2 :(得分:0)

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

如果要将某个类用作 virtual 基类,则public析构函数很重要。如果没有virtual析构函数,则以下操作无效:

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

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

A *a = new B;
delete a;

最后一行不会做正确的事情,因为不会调用B的析构函数。要更正此问题,A的析构函数必须为virtual

请注意,这仅适用于您意图派生的类,以及您希望用户使用public继承的类。对于大多数班级而言,情况通常并非如此。

答案 3 :(得分:0)

最佳说明见以下链接
Link

答案 4 :(得分:0)

就继承而言,将析构函数设置为基类的虚拟是有意义的,以便在通过基类指针调用该特定类的析构函数时释放正确的类对象。因此,它遵循继承的相反顺序。 (孩子对父母)