Асимметричный виртуальный ромб Наследования в C++

Я часто должен напоминать мне, что DateTime является типом значения, не касательно типа. Просто кажется слишком странным мне, особенно рассматривая множество конструкторов для него.

5
задан Cœur 9 April 2018 в 07:42
поделиться

2 ответа

Чтобы упростить ответ, давайте подумаем о виртуальном / невиртуальном как о дублированном или недублированном содержимом.

class LibDerived : LibBase

заявляет: Я разрешаю LibBase дважды (или более) вводить в нисходящую категорию LibDerived

class MyBase : virtual LibBase {};

объявляет: Я разрешаю компилятору оптимизировать две записи LibBase в MyBase по убыванию в одну.

Когда эти два объявления встречаются каждое, первое имеет более высокий приоритет, поэтому MyDerived получает две имплементации LibBase. Но сила c ++ - это возможность решить эту проблему! Просто переопределите виртуальные функции MyDerived, чтобы выбрать, какие из них вы хотите использовать. Или другой способ - создать универсальную оболочку MyDerived, производную от интерфейса LibBase, которая агрегирует любой экземпляр: LibDerived, MyBase, ... и вызывает ожидаемый метод из агрегата.

2
ответ дан 15 December 2019 в 01:08
поделиться

По сути, вы правы. Вам необходимо иметь LibDerived , производный виртуально от LibBase , если вы хотите, чтобы такое дерево наследования работало.

Если у вас его нет, вы не можете предотвратить его отсутствие. -virtual LibBase в LibDerived и отдельная виртуальная LibBase в MyBase .

2
ответ дан 15 December 2019 в 01:08
поделиться
Другие вопросы по тегам:

Похожие вопросы: