啊,SO及时回来了。
我收到一个奇怪的错误:
'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();
}
};
我查找了错误,根据我在 Microsoft 网站上找到的页面,类型可以协变的一种方式是:
B::f 的返回类型中的类与 D::f 的返回类型中的类相同,或者,是 D::f 的返回类型中的类的明确直接或间接基类,并且可在 D 中访问
Inner
和不是这种情况Inner2
吗?如果重要的话,我正在使用 Microsoft Visual C++ 2010。
好的,多亏了 John,我才知道只有指针和引用可以是协变的。这是为什么?Derived 可以强制转换为基类,那么为什么具有从同一事物派生的返回类型的虚拟函数不将返回类型强制转换为基类之一呢?(A*(new B))->blah()
在我的示例中,返回 a似乎是有意义的Inner
,它实际上是一个Inner2
已经被抛出的。