Базовый класс наследован фактически и нефактически в той же иерархии
Отсутствие виртуального наследования происходит когда:
Класс выведен от нескольких базовых классов, и некоторые из тех базовых классов самостоятельно выведены от общего базового класса.
Например, класс 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 |
| Влияние: носитель |