Базовый класс наследован фактически и нефактически в той же иерархии
Отсутствие виртуального наследования происходит когда:
Класс выведен от нескольких базовых классов, и некоторые из тех базовых классов самостоятельно выведены от общего базового класса.
Например, класс Final
выведен от двух классов, Intermediate_left
и Intermediate_right
. И Intermediate_left
и Intermediate_right
выведены от общего класса, Base
.
По крайней мере одним из наследований от общего базового класса является virtual
, и по крайней мере один не virtual
.
Например, наследованием Intermediate_right
от Base
является virtual
. Наследованием Intermediate_left
от Base
не является virtual
.
Если этот дефект появляется, несколько копий элементов данных базового класса появляются в итоговом объекте производного класса. Чтобы получить доступ к правильной копии элемента данных базового класса, необходимо квалифицировать имя элемента и имя метода соответственно в итоговом производном классе. Разработка подвержена ошибкам.
Например, когда дефект происходит, две копии элементов данных базового класса появляются в объекте класса Final
. Если вы не квалифицируете имена методов соответственно в классе Final
, можно присвоить значение элементу данных Base
, но не получить то же значение.
Вы присваиваете значение с помощью метода Base
, к которому получают доступ через Intermediate_left
. Поэтому вы присваиваете значение одной копии участника Base
.
Вы получаете значение с помощью метода Base
, к которому получают доступ через Intermediate_right
. Поэтому вы получаете различную копию участника Base
.
Объявите все промежуточные наследования как virtual
, когда класс выведен от нескольких базовых классов, которые самостоятельно выведены от общего базового класса.
Если вы действительно хотите несколько копий элементов данных Base
, как представлено в промежуточных производных классах, используйте агрегацию вместо наследования. Например, объявите два объекта класса Intermediate_left
и Intermediate_right
в классе Final
.
Группа: Объектно-ориентированный |
Язык: C++ |
Значение по умолчанию: 'off' |
Синтаксис командной строки: MISSING_VIRTUAL_INHERITANCE |
Влияние: носитель |