И B, и C также имеют чисто виртуальные функции (-> должны ли абстрактные классы реализовывать унаследованные чистые виртуальные функции?)
Да D
ДОЛЖЕН реализовать ВСЕ унаследованные чисто виртуальные функции.
Если только класс не реализует все чисто виртуальные функции классов, от которых он производен сам класс действует как абстрактный класс.
Только один из них (B XOR C) имеет чисто виртуальную функцию (-> должен ли другой реализовывать f()?)
D
должен будет реализовать чисто виртуальную функцию, которую он наследует через свои базовые классы в любой иерархии. Если его непосредственный базовый класс не определяет чистую виртуальную функцию, то этот класс также становится абстрактным классом, и если D
не реализует унаследованную чистую виртуальную функцию, он также станет абстрактным.
Ни B, ни C не имеют собственных чистых виртуальных машин (-> возможный способ пропустить реализацию в B и C и «пропустить» ее в D?)
D
должен будет реализовать чистые виртуальные функции, которые он наследует через A->B
и A-C
. Обратите внимание, что в этом случае и B
, и C
будут абстрактными классами.
В каком из трех вышеприведенных случаев D нужно реализовать f()? В каких случаях D необязательно может реализовать f()? В каких случаях D не может реализовать f()?
D
необходимо реализовать foo()
во всех трех вышеперечисленных условиях, чтобы иметь возможность создавать экземпляры (не абстрактные).
Вывод:
- Класс должен реализовать ВСЕ чистые виртуальные функции, которые он наследует от ВСЕХ своих базовых классов, в противном случае класс станет абстрактным классом.
- Виртуальный атрибут наследуется. Если суперкласс объявляет виртуальную функцию, то переопределенная функция в производном классе также является виртуальной и передает виртуальный атрибут всем производным от него классам.
Избегайте Алмаза Смерти! Если вы действительно не понимаете тонкостей, связанных с этим. Многие люди пытаются использовать виртуальное наследование, хотя на самом деле это не самый подходящий способ добиться того, чего хочет их дизайн. Использование виртуального наследования действительно необходимо в некоторых сценариях, тем не менее, это важная конструкция, предоставляемая языком, но чаще используемая неправильным образом. Поэтому имеет смысл еще раз пересмотреть свой проект, чтобы убедиться, что вам действительно нужно виртуальное наследование.
Следующее может быть хорошим чтением:
- Множественное наследование – часть I
- Множественное наследование — часть II
- Множественное наследование – часть III
person
Alok Save
schedule
16.09.2011