牛客网刷题——虚函数/动态绑定

我是题目,from牛客网。
在这里插入图片描述

在这里插入图片描述
结合高赞解析,总结下我的理解,不知道对不对,如果有问题,请评论指出。谢谢!

Base* base = new Derived();

1、上述语句首先定义了一个Base指针,指向一个Derived子类对象(此时该对象还没有被new出来);然后new一个Derived子类对象;
2、该Derived子类对象首先调用基类Base的构造函数(输出Base),初始化基类的数据成员;
然后再来调用Derived子类自己的构造函数初始化子类数据成员(输出Derived)。(整个过程就是这么规定的)。
3、

base->echo();

该过程被调用的函数取决于用来调用函数的句柄,而不是句柄所指向的类型。
该句柄是一个Base基类的指针,因为通过基类的指针或者引用调用了虚函数,此时发生了动态绑定,原则上会访问基类Base的虚函数echo(),但是由于派生类的虚函数覆盖/隐藏了基类的虚函数,所以最终该句柄调用的是派生类Derived的echo()虚函数(输出Derived)。


关于动态绑定
运行过程中的多态要满足三个条件:
1、类之间满足赋值兼容规则。
2、声明了虚函数。
3、由成员函数来调用或者是通过指针或引用来访问虚函数。


对于划线的部分,我不太确定,直接修改代码进行了验证,如果echo不是虚函数,那么结果应该是 Base Derived Base

#include <cstdio>
using namespace std;

class Base {
   
public:
Base() {
   echo();}
/*virtual */void echo() {
   printf("Base\n");}
};
  
class Derived:public Base {
   
public:
Derived() {
   echo();}
/*virtual */void echo() {
   printf("Derived\n"
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值