これらの抽象クラスがFoo
あり、Bar
:
class Foo;
class Bar;
class Foo
{
public:
virtual Bar* bar() = 0;
};
class Bar
{
public:
virtual Foo* foo() = 0;
};
ConcreteFoo
さらに、派生クラスとを持っていると仮定しConcreteBar
ます。foo()
とbar()
メソッドの戻り型を次のように共変的に改良したいと思います。
class ConcreteFoo : public Foo
{
public:
ConcreteBar* bar();
};
class ConcreteBar : public Bar
{
public:
ConcreteFoo* foo();
};
ConcreteBar
私たちの最愛のシングルパスコンパイラは、がから継承することを知らないため、これはコンパイルされません。Bar
したがって、これConcreteBar
は完全に合法的な共変リターン型です。プレーンフォワード宣言ConcreteBar
も、コンパイラに継承について何も通知しないため、機能しません。
これは私が一緒に暮らさなければならないC++の欠点ですか、それとも実際にこのジレンマを回避する方法がありますか?