Наследование не обязательно должно быть «разрешено», как вы выразились, поэтому вопрос не очень ясен.
Важным отличием является обычное наследование и виртуальное наследование. Если вы унаследовали обычно, т.е. B : A
, C : A
, то класс D : B, C
имеет два подклассы типа A
, а именно D::B::A
и D::C::A
. С другой стороны, если B
и C
наследуют фактически от A
, то окончательная композиция подкласса будет отложена до тех пор, пока вы не определите конечный тип. То есть, B : virtual A
и C : virtual A
сами имеют виртуальный подкласс A
, который станет реальным, если вы должны были создать экземпляр либо B
, либо C
. С другой стороны, если вы выйдете из классов дальше, то наиболее производный класс будет содержать только один подкласс типа A
.
Возможно, вам понравится рассмотреть аналогию с элементом функции. Если каждый производный класс добавляет функцию-член с тем же именем, что и базовая функция, вы получаете несколько различных функций. С другой стороны, если базовая функция равна virtual
, тогда у вас будет только одна функция, которая определена в самом производном классе. У вас все еще есть вид функции в каждом промежуточном классе (при условии, что функция не является чистой-виртуальной), но только последний класс определяет «активное» определение.
Виртуальное наследование влияет на конструкторы, а именно, что конструктор виртуальной базы (т.A()
в данном примере), называется непосредственно наиболее производного класса, т.е. D
и не от B
или C
. Если вы это сделаете, это потому, что только D
«знает», что он содержит только один A
-subclass, поэтому он непосредственно «ответственен» за него. B
и C
просто держите виртуальный заполнитель, который уступает место высшему, самому производному классу.
Доступ к функции-члену с помощью любого базового указателя/ссылки ведет себя так, как ожидалось, и разрешается обычным способом (т. Е. Динамически, в общем случае), но это не имеет ничего общего с виртуальным наследованием. Фактический поиск функции может быть немного более сложным, так как может потребоваться дополнительный уровень косвенности, но это ничего не меняет.
Взгляните на http://en.wikipedia.org/wiki/Virtual_inheritance. –
Действительно. -1 для справочного вопроса. –
@OliCharlesworth: Я уже прочитал. Это не помогает понять, как оно реализовано, и его сходство с механизмом виртуальных функций, который включает динамическое связывание. Все, что я понял, это то, что под-объект разделяется между двумя классами, но я хочу знать, по какой цене? – user1086635