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