虚拟析构函数

时间:2010-02-02 09:20:54

标签: .net oop

有人能解释一下虚拟析构函数的概念吗?以及如何在dotnet中照顾它?

4 个答案:

答案 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?