СЦБИСТ - железнодорожный форум, блоги, фотогалерея, социальная сеть
Это сообщение показано отдельно, перейти в тему, где размещено сообщение: Программирование
Старый 05.06.2015, 19:19   #114 (ссылка)
V.I.P.
 
Аватар для bsabsa

Регистрация: 18.03.2010
Сообщений: 288
Поблагодарил: 68 раз(а)
Поблагодарили 25 раз(а)
Фотоальбомы: не добавлял
Репутация: 29
Цитата:
проверить полиморфизм.
Если с некоторого класса в иерархии наследования метод стал виртуальным, то во всех производных от него классах он будет виртуальным, вне зависимости от того, указано ли ключевое слово virtual в классах наследниках.

С*с = new C ();
A*a = c;
a->hgj(); // Напечатает "class C"
B*b = c;
b->hgj(); // Напечатает "class C"

Это оно и есть полиморфизм.

Если в классе есть виртуальные функции, значит должен быть виртуальный деструктор. Если это не сделать будут проблемы с утечками памяти при работе new и delete с указателями.

С*с = new C ();
A*a = c;
B*b = c;

delete b; // Получится memory leak без virtual ~B - не будет вызываться ~C !!!!
// И все ОК при virtual ~B - ~C вызывается

Посмотрите вывод программы

P.S. Хотя в вашем примере вызов деструкторов будет правильный, так как ~A уже виртуальный.
А вот если вообще убрать virtual у ~, тогда будут утечки памяти.

Последний раз редактировалось bsabsa; 05.06.2015 в 19:32.
bsabsa вне форума   Цитировать 0
 Нажмите здесь, чтобы написать комментарий к этому сообщению  
 

Яндекс.Метрика