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