加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c – 协变虚函数返回类型问题

发布时间:2020-12-16 10:43:01 所属栏目:百科 来源:网络整理
导读:我有以下代码: #include iostreamusing 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 Ba
我有以下代码:

#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中的任何一个或两者中的对象类型时(例如虚拟Child2 getChildren()),我在Visual Studio 2010上收到以下错误:

error C2555: 'Base2::getChildren': overriding virtual function return type differs and is not covariant from 'Base1::getChildren'

我想知道为什么我在使用引用时没有得到这个错误,否则就得到它.这是VS2010中的错误吗?因为C标准(根据微软网站上的this页面)说的是:重写函数的返回类型应该与被覆盖函数的返回类型相同或者与函数类的协变相同.并且返回类型为B :: f的类与D :: f的返回类型中的类相同,或者是D :: f的返回类型中类的明确的直接或间接基类.并可在D.访问

附:我目前无法访问该标准,因此无法验证上述报价.

解决方法

你错过了他们引用的另一部分:“如果函数D :: f重写函数B :: f,那么函数的返回类型如果满足以下条件则是协变的:(1)两者都是指向类或引用的指针班”

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读