我通过继承创建了两个简单的类,并在子类中添加了一个虚函数和覆盖.
class Parent
{
public:
virtual Parent foo();
};
class Child : public Parent
{
public:
Child foo() override;
};
Run Code Online (Sandbox Code Playgroud)
在这种情况下,我的重写函数会出错: error C2555: 'Child::foo': overriding virtual function return type differs and is not covariant from 'Parent::foo'
如果我用指针更改返回类型:
class Parent
{
public:
virtual Parent* foo();
};
class Child : public Parent
{
public:
Child* foo() override;
};
Run Code Online (Sandbox Code Playgroud)
错误消失了!我不明白为什么返回类型的协方差必须用指针完成,我不能使用值类型或引用.一些网站或论坛解释说,因为返回的值是函数中使用的值的副本,编译器知道指针的常量大小,但必须指示被覆盖函数和父函数的不同大小,这显然是不可能的.
那么,为什么我不能在这种情况下使用除指针之外的任何东西呢?如果我希望子类型在不使用指针的情况下键入重写函数,那么我必须为每个函数返回基类并将返回的类型转换为子类型吗?