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