Предположим, что у меня есть эти абстрактные классы 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 тоже не работает, поскольку оно не сообщает компилятору ничего о наследовании.
Является ли это недостатком С++, с которым мне придется жить, или есть ли способ преодолеть эту дилемму?