BaseClass * p = new DerivedClass();
delete p;
Я знаю, что вторая линия будет вызывать деструктор базового класса, если он не имеет виртуальный деструктор и что производный класс, если он делает, но будет delete
правильно освободить память (скажем BaseClass
«s объект занимает 8 байтов пространства и DerivedClass
- один из 12 - освободит ли он 8 или 12 байтов) и избавится от объекта в любом случае?«Удаляет» работу с полиморфизмом?
Вы знакомы с 'malloc'/'free' семантика? –
Re: «вызвать деструктор базового класса» - может быть. Если вы удаляете объект производного типа с помощью указателя на базовый тип, а базовый тип не имеет виртуального деструктора, поведение не определено. Он может вызвать деструктор для базового класса, но от этого не требуется. –
@NPS Обратите внимание, что стоит упомянуть, что если вы создали объект DerivedClass в стеке (т.е. - DerivedClass d;), то это не имеет значения, если BaseClass Dtor является виртуальным или нет - два из них (оба от Dtor's) будут вызваны в обратном порядке относительно их построения (т.е. - DerivedClass и BaseClass). –