Я понимаю концепцию виртуального наследования, но нигде не смог найти ответ на этот вопрос. Допустим, у вас есть класс D, который наследует класс B и C. Оба B и C наследуют класс A. Таким образом, вы можете сделать так, чтобы B и C виртуально наследовали A, чтобы избежать двух экземпляров A. Но нужно ли указывать виртуальное наследование как в B, так и в C или он уже создает только один экземпляр A, если один из двух фактически наследует A, а другой — нет?
Спасибо
Они все должны быть virtual
, Из C ++ 11 10.1 [class.mi] / 7:
Класс может иметь как виртуальные, так и не виртуальные базовые классы данного типа.
class B { /* ... */ };
class X : virtual public B { /* ... */ };
class Y : virtual public B { /* ... */ };
class Z : public B { /* ... */ };
class AA : public X, public Y, public Z { /* ... */ };
Для объекта класса AA
все виртуальные вхождения базового класса B
в решетке классов AA
соответствовать одному B
подобъект внутри объекта типа AA
и любое другое вхождение (не виртуального) базового класса B
в решетке классов AA
соответствует один к одному с отчетливым B
подобъект внутри объекта типа AA
, Учитывая класс AA
определено выше, класс AA
имеет два подобъекта класса B
: Z
«s B
и виртуальный B
разделено X
а также Y
, как показано ниже.
Вам нужно указать виртуальное наследование для B и C, чтобы иметь один A. В противном случае класс, который не использует виртуальное наследование, будет «разделять» класс A.
Это может позволить одному иметь следующее:
Почему вы хотите сделать это другое дело.