И B, и C имеют также чисто виртуальные функции (-> должны ли абстрактные классы реализовывать унаследованные чистые виртуалы?)
Да D
НЕОБХОДИМО реализовать ВСЕ унаследованные чистые виртуальные функции.
Если класс не реализует все чистые виртуальные функции классов, он наследуется от самого класса, действующего как абстрактный класс.
Только один из них (B XOR C) имеет чисто виртуальную функцию (-> должен ли другой по-прежнему реализовывать f ()?)
D
потребуется для реализации чистоговиртуальная функция, которую он наследует через свои базовые классы в любой иерархии.Если его непосредственный базовый класс не определяет виртуальную функцию Pure, то этот класс тоже становится абстрактным классом, и, если D
не реализует унаследованную чистую виртуальную функцию, он тоже станет абстрактным.
Ни B, ни C не имеют своих собственных чистых виртуалов (-> возможный способ пропустить имплментацию в B и C и "пропустить ее" к D?)
D
должен будет реализовать чисто виртуальные функции, которые он наследует через A->B
& A-C
. Обратите внимание, что в этом случае и B
, и C
будут абстрактными классами.
В каком из трех вышеупомянутых случаев D должен реализовать f ()?В каких случаях это возможно для D, чтобы реализовать f ()?В каких случаях, если таковые имеются, не возможно ли для D реализовать f ()?
D
должен реализовать foo()
во всех 3 вышеупомянутых условиях, чтобы иметь возможность быть инстанцируемым(Non-Abstract).
Вывод:
- Класс должен реализовывать ВСЕ чистые виртуальные функции, которые он наследует от ВСЕХ своих базовых классов, не в состоянии сделатьпоэтому сделаем класс абстрактным классом.
- Виртуальный атрибут наследуется. Если суперкласс объявляет функцию виртуальную, то переопределенная функция в производном классе также является виртуальной и передает виртуальный атрибут всем классам, производным от него.
Избегайте Алмаза Смерти !Если вы действительно не понимаете тонкости, связанные с этим.Многие люди пытаются использовать виртуальное наследование, когда это не самый удачный способ достичь того, чего хочет добиться их дизайн.Использование виртуального наследования действительно необходимо в некоторых сценариях, тем не менее, это важная конструкция, предоставляемая языком, но чаще используемая неверным образом.Поэтому имеет смысл один раз пересмотреть свой дизайн, чтобы проверить, действительно ли вам нужно виртуальное наследование.
Следующее может быть хорошим чтением:
- Множественное наследование - Часть I
- Множественное наследование - Часть II
- Множественное наследование - Часть III