2016-01-04 3 views
-1

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

Однако в одном из классов у меня есть указатель на объект базового класса.
Теперь, если деструктор производного класса записывается следующим образом:

virtual ~DerivedClass() 
{ 
delete this->pointerToAnotherDerivedClassObject; 
} 

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

EDIT: Моя ошибка для указания, что это указатель на базовый класс, поскольку он фактически является указателем на другой объект производного класса.

+0

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

+0

Я не написал этот код с нуля, он был передан мне на полпути в этом состоянии. – Elia

+1

Является ли это указателем на себя или отдельный объект базового класса? т.е. 'pointerToBaseClassObject = (Base *) this;' или 'pointerToBaseClassObject = other'. – lcs

ответ

2

Однако в одном из классов у меня есть указатель на объект базового класса. Теперь, если деструктор производного класса записывается следующим образом

С pointerToAnotherDerivedClassObject точек другой объекта в памяти, то да, ваш DerivedClass деструктор должен явно delete, что объект (или обернуть сырой указатель внутри умный указатель - std::auto_ptr, std::unique_ptr, или std::shared_ptr - и пусть это delete объект для вас) ТОЛЬКО ЕСЛИDerivedClass предназначен для владения этим другим объектом. В противном случае, не делайте этого delete, если вы не являетесь его владельцем.

+0

Это именно так. И да, он предназначен для владения этим другим объектом. – Elia

0

@ Elia Аналогичная ситуация обсуждается в книге Экеля «мышление в C++ vol-2» в главе 10 шаблона проектирования относительно псевдо-виртуального конструктора. Ответ на ваш вопрос заключается в том, что вам нужно удалить его, если вы выделите его динамически. Также не путайте член Base * с базовым объектом, который является частью производного из-за наследования, один является членом данных (который вы хотите удалить), другой из-за наследования.