假设我有这些抽象类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++ 的一个缺点,还是实际上有办法解决这个困境?