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