3

Будет ли это работать, или будет разрез (т.е. будет освобождена только память, соответствующая занимаемой базовым объектом, а не всего объекта Derived):Удаление указателя базы, указывающего на производный объект

Base* ptr = new Derived; 
delete ptr; 

Если нет, не так ли?

delete static_cast<Derived*>(ptr); 
+4

Если деструктор 'Base' является' virtual', все будет в порядке. Компилятор, скорее всего, предупредит вас, если это не так. – arne

+0

Ах, конечно .. – d7samurai

+3

http://stackoverflow.com/questions/461203/when-to-use-virtual-destructors –

ответ

3

Это будет работать.

Методы вызова производного объекта указателем базового объекта являются одним из основополагающих принципов полиморфизма.

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

+0

Да, это так. Я просто немного устал, я думаю :) Спасибо. – d7samurai

+0

Добро пожаловать;) –

0

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

Смежные вопросы