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

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

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

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

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

-1
Elia 5 Янв 2016 в 00:29

2 ответа

Лучший ответ

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

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

2
Remy Lebeau 4 Янв 2016 в 21:40

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

0
shanker861 4 Янв 2016 в 22:10