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