В C ++ я должен почти всегда использовать виртуальное наследование? - PullRequest
25 голосов
/ 28 декабря 2010

Я вижу из этой записи , что виртуальное наследование добавляет sizeof (указатель) к объему памяти объекта. Кроме этого, есть ли у меня какие-либо недостатки, связанные с использованием виртуального наследования по умолчанию и обычного наследования только при необходимости? Кажется, что это привело бы к более перспективному дизайну классов, но, возможно, я упускаю некоторую ловушку.

Ответы [ 2 ]

23 голосов
/ 28 декабря 2010

Недостатки в том, что

  1. Все классы должны будут все время инициализировать все свои виртуальные базы (например, если A является виртуальной базой B, а C является производной от B, он также должен инициализировать саму A).
  2. Вы должны использовать более дорогой dynamic_cast везде, где вы используете static_cast (может быть, а может и не быть проблемой, в зависимости от вашей системы и того, требует ли ваш дизайн этого).

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

13 голосов
/ 28 декабря 2010

По моему опыту, виртуальное наследование (в отличие от виртуальных методов ) почти никогда не требуется. В C ++ это используется для решения «проблемы наследования алмазов» , которая, если вы избегаете множественного наследования, на самом деле не может произойти.

Я почти уверен, что никогда не сталкивался с виртуальным наследованием вне книг на C ++, которое включает в себя как код, который я пишу, так и более миллиона систем строк, которые я поддерживаю.

...