假设我有这些抽象类 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++ 的一个缺陷,还是有办法绕过这个难题呢?