Я вижу из этой записи, что виртуальное наследование добавляет sizeof (указатель) в область памяти объекта. Кроме этого, существуют ли какие-либо недостатки для меня, просто используя виртуальное наследование по умолчанию и обычное наследование только тогда, когда это необходимо? Похоже, что это привело бы к более перспективному дизайну классов, но, возможно, мне не хватает какой-то ловушки.
В С++, должен ли я почти всегда использовать виртуальное наследование?
Ответ 1
Недостатки в том, что
- Все классы должны будут инициализировать все свои виртуальные базы все время (например, если A является виртуальной базой B, а C - из B, также необходимо инициализировать сам A).
- Вы должны использовать более дорогие
dynamic_cast
везде, где вы используетеstatic_cast
(может и не может быть проблема, в зависимости от вашей системы и того, требует ли ваш проект).
Один только пункт 1 делает его нецелесообразным, поскольку вы не можете скрыть свои виртуальные базы. Существует почти всегда лучший способ.
Ответ 2
По моему опыту, виртуальное наследование (в отличие от виртуальных методов) практически никогда не требуется. В С++ он использовался для решения "проблемы наследования алмазов" , который, если вы избегаете множественного наследования, на самом деле не может произойти.
Я уверен, что никогда не сталкивался с виртуальным наследованием вне книг на С++, который включает в себя как код, который я пишу, так и миллионы + линейные системы, которые я поддерживаю.