Есть ли способ форвард объявить ковариацию?

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

Ответы на вопрос(4)

Ваш ответ на вопрос