Я часто должен напоминать мне, что DateTime является типом значения, не касательно типа. Просто кажется слишком странным мне, особенно рассматривая множество конструкторов для него.
Чтобы упростить ответ, давайте подумаем о виртуальном / невиртуальном как о дублированном или недублированном содержимом.
class LibDerived : LibBase
заявляет: Я разрешаю LibBase дважды (или более) вводить в нисходящую категорию LibDerived
class MyBase : virtual LibBase {};
объявляет: Я разрешаю компилятору оптимизировать две записи LibBase в MyBase по убыванию в одну.
Когда эти два объявления встречаются каждое, первое имеет более высокий приоритет, поэтому MyDerived получает две имплементации LibBase. Но сила c ++ - это возможность решить эту проблему! Просто переопределите виртуальные функции MyDerived, чтобы выбрать, какие из них вы хотите использовать. Или другой способ - создать универсальную оболочку MyDerived, производную от интерфейса LibBase, которая агрегирует любой экземпляр: LibDerived, MyBase, ... и вызывает ожидаемый метод из агрегата.
По сути, вы правы. Вам необходимо иметь LibDerived
, производный виртуально от LibBase
, если вы хотите, чтобы такое дерево наследования работало.
Если у вас его нет, вы не можете предотвратить его отсутствие. -virtual LibBase
в LibDerived
и отдельная виртуальная LibBase
в MyBase
.