Потому что base
не является прямой базой derived2
. Вы должны дать конструктор для ваших прямых баз, derived1
в этом случае.
Виртуальные базы являются исключением. Они всегда инициализируются в листовых классах, в противном случае вы можете получить несколько вызовов конструктора для одной и той же базы. Так что если вы делаете base
виртуальным, вы можете не только инициализировать его в derived2
, вы должны.
Проблема возникает, когда у вас есть деривационный граф, который не является деревом. IBM имеет красивую картинку. Если вы не сделаете базу (V
в примере) виртуальной (везде), у вас будет несколько копий. Если вы сделаете его виртуальным везде, у вас будет только одна копия, но тогда прямые потомки не смогут запустить конструктор (он будет запускаться> 1 раз), а класс листьев должен. Для получения более подробной информации лучше всего искать в Интернете.