виртуальный деструктор - PullRequest
0 голосов
/ 02 февраля 2010

Кто-нибудь может объяснить мне концепцию виртуального деструктора? а также как это заботится в дотнет?

Ответы [ 4 ]

3 голосов
/ 09 сентября 2011

Следующая программа объясняет необходимость виртуального деструктора,

#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
2 голосов
/ 02 февраля 2010

, если вы имеете в виду C ++.

Деструктор всегда должен быть объявлен виртуальным.

Почему? Потому что, когда объект «разрушен», он должен очистить ресурсы объекта, на который мы ссылаемся в коде.

См. Этот пример, чтобы понять:

Class A;
Class B: Public A { int *pVar };


A* x = new B();

delete x

;

В этом случае, если деструктор B не объявлен как виртуальный, деструктор, который будет вызываться, будет деструктором A, и поэтому pVar не будет освобожден. Надеюсь, это ясно.

РЕДАКТИРОВАТЬ : Если это ответ на ваш вопрос, отметьте его как ответ или, по крайней мере, upvote.

РЕДАКТИРОВАТЬ2 : Эта вики ссылка очень хорошо ее описывает.

0 голосов
/ 02 февраля 2010

http://en.wikipedia.org/wiki/Virtual_destructor

О деструкторе и финализаторах см. Отличную статью В чем разница между деструктором и финализатором? Эрик Липперт

0 голосов
/ 02 февраля 2010

Концепция заключается в том, что каждый тип в строке наследования до корня (Object) имеет возможность выполнить очистку. Это в основном та же концепция, что и в обычном виртуальном методе.

В .NET метод Finalize() в основном таков. Но учтите, что, поскольку .NET - это управляемая среда с сборщиком мусора, который не является детерминированным, момент вызова метода Finalize() также не является детерминированным.

Если это отвечает на ваш вопрос, примите его как ответ.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...