嗯,所以及时回来了。

我收到一个奇怪的错误:

 'B::blah': overriding virtual function return type differs and is not covariant from 'A::blah'

这是导致问题的代码:
class A {
public:
    class Inner { };

    virtual Inner blah() = 0;
};

class B : public A {
public:
    class Inner2 : public Inner { };

    Inner2 blah() {
        return Inner2();
    }
};

我查找了错误,并根据a page I found on the Microsoft website,类型可以协变的一种方法是:


InnerInner2不是这种情况吗?如果有问题,我正在使用Microsoft Visual C++ 2010。

好的,感谢约翰,我了解到只有指针和引用可以是协变的。这是为什么?可以将Derived强制转换为Base,那么为什么不将具有从同一事物派生的返回类型的虚函数仅将返回类型强制转换为基类之一呢?在我的示例中,让(A*(new B))->blah()返回实际上是已被丢弃的InnerInner2似乎很有意义。

最佳答案

只有指针和引用可以是协变的。

08-16 02:03