可能重复:
When to use virtual destructors?
Virtual destructor and undefined behavior
我是c ++和编程的新手,我观察到析构函数总是被声明为虚拟。 我可以知道为什么会这样吗?
先谢谢
答案 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)
就继承而言,将析构函数设置为基类的虚拟是有意义的,以便在通过基类指针调用该特定类的析构函数时释放正确的类对象。因此,它遵循继承的相反顺序。 (孩子对父母)