Виртуальное наследование, одного класса достаточно?

Я понимаю концепцию виртуального наследования, но нигде не смог найти ответ на этот вопрос. Допустим, у вас есть класс D, который наследует класс B и C. Оба B и C наследуют класс A. Таким образом, вы можете сделать так, чтобы B и C виртуально наследовали A, чтобы избежать двух экземпляров A. Но нужно ли указывать виртуальное наследование как в B, так и в C или он уже создает только один экземпляр A, если один из двух фактически наследует A, а другой — нет?

Спасибо

9

Решение

Они все должны быть 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, как показано ниже.

пример виртуального наследования

13

Другие решения

Вам нужно указать виртуальное наследование для B и C, чтобы иметь один A. В противном случае класс, который не использует виртуальное наследование, будет «разделять» класс A.

Это может позволить одному иметь следующее:

наследование

Почему вы хотите сделать это другое дело.

8

По вопросам рекламы [email protected]