Есть ли способ форвард объявить ковариацию?
Предположим, у меня есть эти абстрактные классы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 ++, с которым мне придется смириться, или есть ли способ обойти эту дилемму?