Виртуальные классы в алмазном наследовании с несколькими классами между базовым классом и наиболее производным классом - PullRequest
0 голосов
/ 05 апреля 2020

Хорошо, так в примере наследования алмазов classi c у вас есть базовый класс, два класса, которые наследуются от этого базового класса, а затем еще один класс, который наследуется от этих двух, что делает хороший симметричный ромб. В этом случае два класса наследуются практически от базового класса, чтобы избежать наличия двух копий базового класса в самом производном классе.

Но что, если существует несколько уровней наследования между базовым классом и наиболее производный класс, как видно из примера диаграммы ниже. Все ли классы (B, C, D) должны наследоваться виртуально от их прямых базовых классов или только те, которые наследуются напрямую (B, C) от базового класса? Предполагая, что нет других классов, кроме тех, что на диаграмме.

enter image description here

1 Ответ

2 голосов
/ 05 апреля 2020

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

class B : public virtual A { ... };
class C : public virtual A { ... };

Источник: https://en.cppreference.com/w/cpp/language/derived_class

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...