相关疑难解决方法(0)

覆盖虚函数返回类型不同且不协变

啊,SO及时回来了.

我收到一个奇怪的错误:

 'B::blah': overriding virtual function return type differs and is not covariant from 'A::blah'
Run Code Online (Sandbox Code Playgroud)

以下是导致问题的代码:

class A {
public:
    class Inner { };

    virtual Inner blah() = 0;
};

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

    Inner2 blah() {
        return Inner2();
    }
};
Run Code Online (Sandbox Code Playgroud)

我查了一下错误,根据我在微软网站上找到的一个页面,类型可以协变的方式之一是:

返回类型B :: f中的类与D :: f的返回类型中的类相同,或者是D :: f的返回类型中类的明确的直接或间接基类,在D中可以访问

是不是InnerInner2?如果重要的话我正在使用Microsoft Visual C++ 2010.


好的,感谢John,我了解到只有指针和引用才能协变.这是为什么?可以将Derived转换为Base,那么为什么具有从同一事物派生的返回类型的虚函数不会将返回类型转换为基类的类型?在我的例子中,似乎(A*(new B))->blah()返回一个Inner实际上Inner2已被抛出的东西是有道理的.

c++ virtual-functions return-type covariance object-slicing

8
推荐指数
1
解决办法
9926
查看次数