Eugie » 12 июл 2005, 17:04
Одно из правил С++ -- "виртуальный однажды - виртуальный всегда"
Безусловно. Собственно, речь шла о том, что если в базовом классе объявлен виртуальный деструктор, хорошим правилом является ЯВНО объявлять таковой и во всех производных классах (слово virtual при этом можно опустить). Т.е. не стоит полагаться на компилятор, т.к. виртуальные деструкторы, в отличие от обычных виртуальных функций, не распространяются автоматически на производные классы, если явно не реализованы в них. Компилятор в таком случае сгенерит деструктор по умолчанию, который вызовет деструктор базового класса, но все виртуальные функции в нем будут вызваны, когда "производная" часть объекта уже как бы не существует, т.е. будет вызвана именно реализация из базового класса. Это особенность именно виртуальных деструкторов.
См.также
http://www.codersource.net/cpp_virtual_destructors.html
[quote]Одно из правил С++ -- "виртуальный однажды - виртуальный всегда"[/quote]
Безусловно. Собственно, речь шла о том, что если в базовом классе объявлен виртуальный деструктор, хорошим правилом является ЯВНО объявлять таковой и во всех производных классах (слово virtual при этом можно опустить). Т.е. не стоит полагаться на компилятор, т.к. виртуальные деструкторы, в отличие от обычных виртуальных функций, не распространяются автоматически на производные классы, если явно не реализованы в них. Компилятор в таком случае сгенерит деструктор по умолчанию, который вызовет деструктор базового класса, но все виртуальные функции в нем будут вызваны, когда "производная" часть объекта уже как бы не существует, т.е. будет вызвана именно реализация из базового класса. Это особенность именно виртуальных деструкторов.
См.также [url]http://www.codersource.net/cpp_virtual_destructors.html[/url]