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