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