作者热门文章
- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我有以下代码:
#include <iostream>
using namespace std;
class Child1
{
int i;
};
class Child2 : public Child1
{
int j;
};
class Base1
{
public:
virtual Child1& getChildren()
{
cout << "Children1" << endl;
return children;
}
private:
Child1 children;
};
class Base2 : public Base1
{
public:
virtual Child2& getChildren()
{
cout << "Children2" << endl;
return children;
}
private:
Child2 children;
};
此代码编译正常,但当我更改 getChildren()
的返回类型时从一个或两个中的引用类型到对象类型 Base1
和 Base2
(例如 virtual Child2 getChildren()
,我在 Visual Studio 2010 上收到以下错误:
error C2555: 'Base2::getChildren': overriding virtual function return type differs and is not covariant from 'Base1::getChildren'
我想知道为什么我在使用引用时没有得到这个错误,而以其他方式得到它。这是VS2010中的错误吗?因为 C++ 标准(根据 Microsoft 网站上的 this 页面)是这样说的:覆盖函数的返回类型应与被覆盖函数的返回类型相同或与函数的类协变。 并且 B::f 的返回类型中的类与 D::f 的返回类型中的类是同一个类,或者是D::f 的返回类型,可在 D 中访问。
附言我目前无法访问该标准,因此无法验证上述报价。
最佳答案
您错过了他们引用的另一部分:“如果函数 D::f 覆盖函数 B::f,则函数的返回类型是协变的,前提是它们满足以下条件:(1) 两者都是类的指针或类的引用”
关于c++ - 协变虚函数返回类型问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5076226/
在我的设置中,我试图有一个界面 Table继承自 Map (因为它主要用作 map 的包装器)。两个类继承自 Table - 本地和全局。全局的将有一个可变的映射,而本地的将有一个只有本地条目的映射。
Rust Nomicon 有 an entire section on variance除了关于 Box 的这一小节,我或多或少地理解了这一点和 Vec在 T 上(共同)变体. Box and Vec
我是一名优秀的程序员,十分优秀!