virtual和override 之间的继承关系

在这里插入图片描述
当然,以上BB是继承于AA的

原则:

1、当调用函数时,系统会直接去检查 声明类 ,看所调用的函数是否为虚函数;

2、如果不是,那么它就直接执行该函数。如果是virtual函数,则转去检查对象的 实例类

3、在实例类中,若有override的函数,则执行该函数,如果没有,则依次上溯,按照同样步骤对父类进行检查,直道找到第一个override了此函数的父类,然后执行该父类中的函数。

上溯 过程中,子类中与父类同名方必须为Vartual与Override关系才认同为同一个方法,在子类上溯时才能关联查询到,否则将会导致上溯中断从而直接调用声明类中的方法。

例子:

在这里插入图片描述
结果:
在这里插入图片描述

讲解:

DD dd = new DD(); 打印的是:DD这个没啥讲的,没有子类,没有多态

CC cc = dd;
1.这个类会查看CC中的displayName(虽然在本类中没有virtual,但在他父级的父级中有)是个虚方法,于是在DD类中寻找他的重写(Override)
2.结果没有找到
3.于是上溯回到CC中寻找,找到了,用了CC中的displayName方法

BB bb = dd;
1.在BB中发现displayName为虚方法,于是在DD中寻找,
2.没有重写
3.上溯到CC中,寻找到了CC的重写,于是用了CC中的displayName

(重点)AA aa = dd;
1.在AA中发现displayName是虚方法
2.于是在DD里寻找,没有重写
3.于是上溯到CC里寻找,有重写,但重写的是BB中的方法
4.BB和AA中的displayName不是同一个方法吗?答:不是的
5.类为他们之间没有Virtual与Override关系
6.因而最后调用了AA类中的displayName,因为在BB中就中断了,没有方法重写他

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小盖子

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值