これらの抽象クラスが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++の欠点ですか、それとも実際にこのジレンマを回避する方法がありますか?