struct B { int member; }; std::ostream& operator<< (std::ostream& os, const B& b) { return os << b.member; } これで、 B b; std::cout << b << std::endl; が通る。
このベースクラスBを派生すると struct D : public B {}; D d; std::cout << d << std::endl; // エラー コンパイルできない。
struct A { A() {} virtual ~A() {} }; struct B : public A { B() {} virtual ~B() {} }; struct C : public A { C() {} virtual ~C() {} }; struct D : public B { D() {} virtual ~D() {} }; struct E : public B, public C { E() {} virtual ~E() {} }; struct F : public C { F() {} virtual ~F() {} }; struct G : public D, public E { G() {} virtual ~G() {} }; struct H : public E, public F { H() {} virtual ~H() {} }; struct I : public G, public H { I() {} virtual ~I() {} };