qq_51426957 2021-11-26 06:57 采纳率: 100%
浏览 45
已结题

c++virtual大家来看看吧

问题都写在图片上了我想了一晚上看了很多文章还是没想明白,我眼睛都睁不开可是我还是没想明白,求大佬们了救救我吧

img

img

img

img

  • ****求评价一下我的个人理解,谢谢了╭(°A°`)╮
  • 写回答

2条回答 默认 最新

  • fortunely2 2021-11-26 14:33
    关注

    你的理解是不对的。首先,你的void o()函数是不是漏掉了virtual关键字?如果没有virtual,那就是普通函数,只有virtual才会是虚函数(derived class中的同名函数会自动继承virtual,无需声明该关键字)。
    其次,你用到的都是对象,而非指针,对象施行的是静态绑定,而非动态绑定。也就是说,当将子类对象赋值给父类对象的时候,会发生截断,从而只保留父类那一部分。例如,

    a po;
    abc pi = po;
    pi.o();
    

    相当于,

    a po; // 构造class a对象
    abc temp = (abc)po; // 截断po,只保留base class abc那一部分
    abc pi = temp; // 拷贝构造abc对象pi
    

    你用base class对象调用函数,当然调用的是base class的函数了。

    记住:动态行为只有在利用指针或引用的时候,才会体系出来,利用对象本身体系的是静态行为。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(1条)

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 12月11日
  • 已采纳回答 12月11日
  • 创建了问题 11月26日

悬赏问题

  • ¥15 同一个网口一个电脑连接有网,另一个电脑连接没网
  • ¥15 神经网络模型一直不能上GPU
  • ¥15 pyqt怎么把滑块和输入框相互绑定,求解决!
  • ¥20 wpf datagrid单元闪烁效果失灵
  • ¥15 券商软件上市公司信息获取问题
  • ¥100 ensp启动设备蓝屏,代码clock_watchdog_timeout
  • ¥15 Android studio AVD启动不了
  • ¥15 陆空双模式无人机怎么做
  • ¥15 想咨询点问题,与算法转换,负荷预测,数字孪生有关
  • ¥15 C#中的编译平台的区别影响