>>168 class C : public B { public: A& geta() { static A a(0); return a; } //コンストラクタほか省略 }; このとき、こうされたらどうする? C c; B& b = c; b.geta().ptr(); B型の式に対してgeta()を呼ぶとB&が返ってくることにしたら、 このb.geta()ではA型のインスタンスへの参照を返しているので型システムを侵すことになる。
だから暗黙的にやらないで、B内ではB&を返すgetaを明示的にオーバーライドしてやったほうがいい。 次のコードはC::getaでコンパイルエラーになる struct A {virtual A& geta();}; struct B : A {virtual B& geta();}; struct C : B {virtual A& geta();};