Всем привет.
Есть вот такой код:
#include <iostream> class A { public: ~A() { std::cout << "~A"; }; }; class B: public A { public: virtual ~B( ) { std::cout << "~B"; }; }; int main( int argc, char** argv) { A *a = new B( ); delete a; return 0; }
Он компилируется, но при запуске почему-то вылетает ошибка исключения.
И ещё вопрос - в чём смысл во втором классе делать деструктор виртуальным?
Никаких ошибок не вылетает (да и не должно):
https://ideone.com/e5ypVh
Хм.. А на MSVC у меня вылетает..
Ну да ладно..
А зачем виртуальный деструктор во втором классе делать?
DEN 3D
> А зачем виртуальный деструктор во втором классе делать?
сделай в первом : )
DEN 3D
> в чём смысл во втором классе делать деструктор виртуальным
он везде должен быть виртуальным, иначе ты не вызовешь деструктор потомка по указателю на предок.
DEN 3D
> Есть вот такой код:
Это код из какого-то теста на проверку знаний по C++?
sapogi.jpg
PANDA
рановато для зимней сессии :)
Мизраэль
>
> он везде должен быть виртуальным, иначе ты не вызовешь деструктор потомка по
> указателю на предок.
>
Он должен быть виртуальным в базовом классе (class A)
Если в базовом классе деструктор виртуальный, в дочерних классах спецификатор virtual необязателен, деструктор в любом случае будет виртуальным.
Стало любопытно. Может ли подобный код из нуль-поста(когда в базовом классе деструктор не виртуальный, а в наследнике(ах) виртуальный) применяться для каких-то целей на практике. Известно ли что-нибудь по данному вопросу?
Vitorio
> Может ли подобный код из нуль-поста(когда в базовом классе деструктор не
> виртуальный, а в наследнике(ах) виртуальный) применяться для каких-то целей на практике.
Если от наследников дальше ничего не наследуется, смысла в виртуальности там никакого.
Отсутствие же виртуальности в базовом классе может значить что удалять нельзя через базовый, вот и все. Удалять что создавали или удалять через addref/release можно и без виртуального деструктора. Но надо бы как-нибудь этот факт описывать, опасно оставлять просто так, как этом коде. Кто-нибудь взорвется.
Бери шинель, пошли домой.
Тема в архиве.