C ++ виртуальные деструкторы - PullRequest
3 голосов
/ 26 апреля 2011

Если у меня есть базовый класс и производный класс, и я исключаю деструктор из родительского виртуального объекта, но создаю экземпляр объекта подкласса типа, то при уничтожении он вызовет право родительского деструктора (начиная с виртуального)?Если я также объявлю деструктор в производном классе, он вызовет оба деструктора (базовый и производный).Заранее спасибо: -).

Вторая часть моего вопроса касается первой.Почему деструктор базового класса должен быть объявлен виртуальным.Не зацикливайся на высоких скоростях.Они не имеют одно и то же имя, так в чем же оно?Разве это не должно работать одинаково для деструкторов, или по умолчанию вызывается только один?Кроме того, с помощью позднего связывания он может обнаружить все классы и объекты, из которых сделан объект?

РЕДАКТИРОВАТЬ: Мой вопрос не только о виртуальных деструкторах, но почему он должен быть объявлен виртуальным, так как они должны всевызываться по умолчанию.

Ответы [ 3 ]

8 голосов
/ 26 апреля 2011

Да, родительские деструкторы будут вызываться автоматически.

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

В очень ограниченных обстоятельствах не стоит виртуализировать, если вам действительно нужно сэкономить несколько циклов при поиске в vtable.

4 голосов
/ 26 апреля 2011

Потребность в виртуальных деструкторах обусловлена ​​полиморфизмом. Если у вас есть что-то вроде следующего:

 class A { ... };

 class B : public A { ... };

 void destroy_class(A* input)
 {
     delete input;
 }

 int main()
 {
     B* class_ptr = new B();
     destroy_class(class_ptr); //you want the right destructor called

     return 0;
 }

Хотя это немного надуманный пример, когда вы удаляете переданный указатель для функции destroy_class(), вы хотите, чтобы вызывался правильный деструктор. Если деструктор для class A не был объявлен virtual, то будет вызван только деструктор для class A, а не деструктор для class B или любой другой производный тип class A.

Подобные вещи очень часто бывают фактом жизни с не шаблонными полиморфными структурами данных и т. Д., Где одной функции удаления, возможно, придется удалять указатели некоторого типа базового класса, который фактически указывает на объект производный тип.

2 голосов
/ 26 апреля 2011

rubixibuc,

Да, сначала вызывается деструктор подклассов, затем суперкласс ... потом суперкласс и так далее, пока мы не дойдем до деструктора объекта.

Подробнее здесь: http://www.devx.com/tips/Tip/13059 ... стоит прочитать ... только экран заполнен, но ИНФОРМАЦИОННО экран заполнен.

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