drawingourmoments 2022-05-16 15:00 采纳率: 100%
浏览 28
已结题

一道c++虚函数相关问题的疑问


class GA
{
public:
    virtual int f()
    {
        return 1;
    }
};

class GB :public GA
{
public:
    virtual int f()
    {
        return 2;
    }
};

void show(GA g)
{
    cout << g.f();
}

void display(GA& g)
{
    cout << g.f();
}

void main()
{
    GA a;
    show(a);
    display(a);
    GB b;
    show(b);
    display(b);
}

输出的是1112;
为什么show(b)调用的还是基类的函数 但display(b)调用的却是派生的函数呢?
函数参数中加了一个引用的话有什么不同呢?
麻烦各位看看 谢谢!

  • 写回答

1条回答 默认 最新

  • bostonAlen 2022-05-16 17:00
    关注
    GB b;
    GA g_show = b;
    GA &g_display = b;
    cout << g_show.f();
    cout << g_display.f();
    cout << b.f();
    

    首先引用作为函数参数,形参就是实参。
    其次在语法上,基类类型可以接受子类类型的赋值。
    show(b)本质上就是我代码中的g_show.f();
    display(b)本质上就是我代码中的g_display.f();
    当你用GB b; GA a=b;时。此时即使将GB赋值给GA了,但a还是GA,因为子类赋值给父类,只是对父类的那部分进行的赋值.非父类的那部分被"截断了"
    但是当你使用GA* a = &b;或者GA& a=b;时,此时就是多态,即父类指针或父类引用指向子类对象,此时子类的虚函数表通过virtual覆盖了父类的f函数,从而调用了子类的f函数。这里你可以尝试去了解virtual的原理,包括虚函数表、虚表指针等。

    此时你把父类的virtual或者你把引用去掉,输出就是1111;就没有多态了。

    另外补充一下,只要父类写了virtual,子类默认不写virtual也是默认给你加了virtual的。一虚到底·

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录

报告相同问题?

问题事件

  • 系统已结题 5月24日
  • 已采纳回答 5月16日
  • 创建了问题 5月16日

悬赏问题

  • ¥15 R语言绘制生存曲线时出现警告:All aesthetics have length 1, but the data has 2 rows.
  • ¥15 pyqt怎么把滑块和输入框相互绑定,求解决!
  • ¥20 wpf datagrid单元闪烁效果失灵
  • ¥15 券商软件上市公司信息获取问题
  • ¥100 ensp启动设备蓝屏,代码clock_watchdog_timeout
  • ¥15 Android studio AVD启动不了
  • ¥15 陆空双模式无人机怎么做
  • ¥15 想咨询点问题,与算法转换,负荷预测,数字孪生有关
  • ¥15 C#中的编译平台的区别影响
  • ¥15 软件供应链安全是跟可靠性有关还是跟安全性有关?