有人能解释一下虚拟析构函数的概念吗?以及如何在dotnet中照顾它?
答案 0 :(得分:3)
以下程序解释了虚拟析构函数的需要,
#include <iostream>
#include <conio.h>
using namespace std;
class Base
{
public:
Base()
{ cout<<"Constructor: Base"<<endl;}
~Base()
{ cout<<"Destructor : Base"<<endl;}
};
class Derived: public Base
{
public:
Derived()
{ cout<<"Constructor: Derived"<<endl;}
~Derived()
{ cout<<"Destructor : Derived"<<endl;}
};
void main()
{
Base *Var = new Derived();
delete Var;
_getch();
}
在上面的程序中,您可以看到基类的析构函数不是虚拟的,因此上述程序的输出将如下所示,
Constructor: Base
Constructor: Derived
Destructor : Base
在上述情况下,不会调用派生对象的析构函数。因此,如果您将基类的析构函数设置为虚拟,那么输出将如下所示,
Constructor: Base
Constructor: Derived
Destructor : Derived
Destructor : Base
答案 1 :(得分:2)
如果您指的是C ++。
必须始终将析构函数声明为虚拟。
为什么呢? 因为当对象被“破坏”时,它必须清除我们在代码中引用的对象的资源。
请参阅此示例以了解:
Class A;
Class B: Public A { int *pVar };
A* x = new B();
delete x
在这种情况下,如果B的析构函数未声明为虚拟,则将调用的析构函数是A的析构函数,因此不会释放pVar。 希望这很清楚。
编辑:如果这回答了您的问题,请将其标记为答案或至少是upvote。
EDIT2 :这个wiki link很好地描述了它。
答案 2 :(得分:0)
概念是继承行中直到根(Object
)的每个类型都有机会进行清理。它与普通的虚拟方法基本相同。
在.NET中,Finalize()
方法基本上就是这样。但请注意,由于.NET是一个托管环境,其垃圾收集器不具有确定性,因此调用Finalize()
方法的时刻也不确定。
如果这回答了你的问题,请接受它作为答案。
答案 3 :(得分:0)
http://en.wikipedia.org/wiki/Virtual_destructor
关于析构函数和终结器,请参阅Eric Lippert撰写的文章What’s the difference between a destructor and a finalizer?