Проблема в том, что DerivedB
- это VirtualBase
(что является Printable
) и Named
(что является Printable
), поэтому operator<<
пытается преобразовать DerivedB
в Printable
, но не может быть понижен, потому что это два Printable
объекта, и он не знает, к какому из них понижать. Поскольку вы хотите, чтобы DerivedB
производился только от одного Printable
объекта, вы должны использовать виртуальное наследование .
normal inheritance: virtual inheritance:
Printable Printable Printable
| | / \
VirtualBase Named VirtualBase Named
\ / \ /
DerivedB DerivedB
Что делается просто:
struct Named abstract : virtual public Printable
struct VirtualBase abstract : virtual public Printable
Обратите внимание, что класс с виртуальным наследованием больше и на немного * на 1025 * медленнее, чем без него, но, с другой стороны, C ++ является одним из очень немногих языков , который может это делать вообще .