Подтвердить что ты не робот

В С++, должен ли я почти всегда использовать виртуальное наследование?

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

4b9b3361

Ответ 1

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

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

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

Ответ 2

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

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