2

Скажем, у меня есть две базовые классы,Если деструктор базового класса, который вы не будете использовать для удаления объекта, должен быть виртуальным?

struct A {}; 
struct B {}; 

и производный тот, который использует множественное наследование

struct D : A, B {}; 

Если я использую сценарий выглядит примерно так:

A *obj = new D; 

т.е. Я никогда не буду использовать базовый класс B для ссылки на производный объект, Мне нужно сделать деструктор обеих баз виртуальным? В настоящее время я объявляю деструктор B как protected, чтобы запретить другим пользователям делать это, но достаточно ли этого?

Как насчет деструктора D?

+0

Нет, но вы должны. –

+3

Если вы никогда не будете ссылаться на 'D' как' B', вас может заинтересовать ['protected 'или' private' наследование.] (Http://stackoverflow.com/questions/860339/difference-between -private-public-and-protected-inheritance) – jaggedSpire

+2

Чтобы процитировать могучего Скотта Мейерса: * ... объявить виртуальный деструктор в классе тогда и только тогда, когда этот класс содержит хотя бы одну виртуальную функцию *. –

ответ

7

Не нужно, чтобы деструктор B был виртуальным, если B* никогда не используется для удаления производных объектов. См [expr.delete]/3:

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

В этом случае «статического типа» тип TCV, где операнд имеет тип deleteTрезюме*. Таким образом, требования в вашем случае налагаются на A, а не на B.

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