gpt4 book ai didi

C++ : Covariant return type without pointer

转载 作者:搜寻专家 更新时间:2023-10-31 00:27:42 31 4
gpt4 key购买 nike

我通过继承创建了两个简单的类,并在子类中添加了一个虚函数和覆盖。

class Parent
{
public:
virtual Parent foo();
};

class Child : public Parent
{
public:
Child foo() override;
};

在这种情况下,我重写的函数得到一个错误: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;
};

错误消失了!我不明白为什么返回类型的协变必须用指针完成,我不能使用值类型或引用。一些网站或论坛解释说,因为返回值是函数中使用的值的拷贝,编译器知道指针的常量大小,但必须为被覆盖的函数和父函数指定不同的大小,这显然是不可能的。

那么,为什么在这种情况下我不能使用指针以外的任何东西?如果我想要重写函数中的子类型而不使用指针,我是否必须为每个函数返回基类并将返回的类型转换为子类型?

最佳答案

协变返回类型的思想是多态返回类型。而在 C++ 中,没有指针或引用就无法实现运行时多态性。让我们暂时忽略大部分困难,假装这是可能的。这是我通过 Parent 接口(interface)处理事情的代码:

void bar(Parent * p) {
auto o = p->foo();
}

什么是o?嗯,当然是 Parent。在 Parent::foo 的返回类型中这样说。但是,如果 p 指向一个 Child 怎么办? o 的推导类型仍然是 Parent,所以充其量我得到一个切片对象。没有多态行为,所以整个练习毫无意义。

在最坏的情况下,我很可能会遇到未定义的行为。

这就是为什么协变返回类型必须是指针或引用。

关于C++ : Covariant return type without pointer,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48001688/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com