【牛客网】 多态经典选择题

  • 引言:今天在牛客网刷题时遇到了三个很经典的关于继承和多态的选择题,想在这里和大家一起分享一下思路和心得体会。

  • :在这里我们注意到virtual函数是动态绑定,而C++编译器中默认缺省参数值则是静态绑定。
    那么虚函数是如何实现动态绑定的呢?
    :通过类的虚函数表和对象的虚表指针,通过对象的虚表指针我们可以找到实际类的虚函数表,从而多态调用不同的虚函数。
    根据《Effective C++》条款37结论:绝不重新定义继承而来的缺省参数值

接下来我们需要理解题中p–>test()所执行的过程:

  • (1) 由于B类中没有覆盖(重写)基类函数中的虚函数tese(),因此会调用基类A中的test();
  • (2) A中test()函数中继续调用虚函数
    fun(),因为虚函数执行动态绑定,p此时的动态类型(即目前所指对象的类型)为B*,因此此时调用虚函数fun()时,执行的是B类中的fun();所以先输出“B->”;
  • (3)缺省参数值是静态绑定,即此时val的值使用的是基类A中的缺省参数值,其值在编译阶段已经绑定,值为1,所以输出“1”;
  • (4)最终输出“B->1”。所以大家还是记住上述结论:绝不重新定义继承而来的缺省参数值!

所以本题选择B:B->1


  • (1)首先声明为A类型的指针指向实际类型为A的对象,调用的肯定是A的方法,输出1 2,

  • (2)然后声明为A类型的指针指向实际类型为B的对象,则非虚函数调用A的方法,输出1,虚函数调用实际类型B的方法,输出4

  • (3)声明类型为A的指针指向实际类型为B的对象,进行一个强制类型转换,其实这种父类指针指向子类会自动进行类型转换,所以是否强制类型转换都不影响结构,原理同上一步,结果输出1 4

    所以最终输出为121414
    

要点

  • 1.判断要点:如果不是重载也不是覆盖,派生类和基类中一旦出现同名函数,一定触发隐藏机制(这是个简便判断技巧,你可以考虑除去重载和覆盖的任何同名函数情况,一定满足隐藏机制触发的两条规则)。
  • 2.隐藏触发的结果:指针对成员的函数调用取决于指针类型。若本身是基类指针(不管指向基类还是派生类)则仍然调用基类成员(不会牵扯到派生类,此处是隐藏,和多态没关系,按第1点已说明隐藏的触发可以首先排除覆盖,也就是多态问题);
  • 3.若本身是派生类指针,这时你就会看到隐藏的威力!此时不是简单地继承基类的成员,然后根据参数匹配调用,而是隐藏基类成员,只会调用派生类成员。

重点:C++多态的实现方式是虚函数表和虚表指针。

其中,C++编译器为每个类内含有virtual函数的类生成一个虚函数表,基类生成基类的虚函数表,虚函数表中包含类内所有虚函数的函数指针,即函数指针数组。

C++调用虚函数时通过虚函数指针来间接调用。动态绑定有点类似于函数指针,当函数指针赋予不同值时就调用不同的函数。虚函数指针则是当赋予不同值时调用不同的函数组。

C++编译器为每个含virtual的类对象添加一个虚函数表指针,在调用对象的构造函数的时候初始化该虚函数表指针。在构造子类的时候需要先构造基类,所以在初始化虚函数表的指针时先用基类的虚函数表地址再用子类的虚函数表地址初始化该虚函数指针。
在本题中,在构造基类的时候,虚表指针是指向基类的虚函数表,所以调用的就基类的func();
构造子类的时候,虚表指针则指向了子类的虚函数表,调用的自然就是子类的func()。

本题思路如下:

  • 因为是无参构造,所以默认调用父类的无参构造,输出0,其实父类在构造时不考虑自己是否调用虚函数,因为虚函数还没构建,打印自己的0,然后b构建,这时候已经有A了,调用了子类的虚函数,已经可以指向子类的了,所以打印1,再次调用test,因为指针是B型的,所以调用b的那个,输出2,如果转换成A的实例就不一样了,但是这题没转。

思路如图

【牛客网】---多态经典选择题相关推荐

  1. 牛客网50道选择题(1)

    1 答案:进入到try块 进入到finally块 后续代码 解析: try { //执行的代码,其中可能有异常.一旦发现异常,则立即跳到catch执行.否则不会执行catch里面的内容 }catch ...

  2. C语言入门必刷题-牛客网精选-经典题型-一定来试试哦

    文章目录 BC117 小乐乐走台阶 描述 输入描述: 输出描述: 示例1 示例2 分析 BC98 序列中删除指定数字 描述 输入描述: 输出描述: 示例1 示例2 BC95 最高分与最低分之差 描述 ...

  3. 牛客网_数量关系选择题

    6 ,14 ,30 ,62 ,( ) 正确答案: C 你的答案: C (正确) 85 92 126 250 办公室的基本功能从社会组织的整体看,办公室是管理工作的中心,处于( ) 正确答案: A 你的 ...

  4. 牛客网Java选择题练习

    牛客网Java选择题练习 2021/1/12 2021/1/13 2021/1/14 2021/1/16 2021/1/17 2021/1/18 2021/1/20 2021/1/21 2021/1/ ...

  5. 牛客网_Go语言相关练习_选择题(2)

    注:题目来源均出自牛客网. 一.选择题 Map(集合)属于Go的内置类型,不需要引入其它库即可使用. Go-Map_菜鸟教程 在函数声明中,返回的参数要么都有变量名,要么都没有. C选项函数声明语法有 ...

  6. 【百日冲大厂】第十篇,牛客网选择题+编程题井字棋+密码强度等级

    前言: 大家好,我是良辰丫,刷题的第十篇,牛客网选择题+编程题井字棋+密码强度等级.

  7. 【百日冲大厂】第二篇,牛客网选择题+排序子序列+倒置字符串

    前言: 大家好,我是良辰丫,今天是刷题的第二篇,牛客网选择题+排序子序列+倒置字符串,每天都去努力,每天都庆幸今天的自己比昨天的自己更优秀,加油,为理想而努力吧!!!

  8. 2016面试整理--来源牛客网

    马上国庆节了,首先祝大家最后都能有个满意的offer,国庆几天好好养精蓄锐. 我经常在牛客群里水群,应该不少人看我眼熟的. 本人是一个杭州渣硕,本科也很一般,和211 985半点都粘不到,没有参加过A ...

  9. 【转自牛客网】C++类职位校招

    作者:./a.out 链接:https://www.nowcoder.com/discuss/14022 来源:牛客网 话说在牛客网上混迹了半年,也没啥拿的出手的贡献.现在基本上自己的校招生涯要告一段 ...

最新文章

  1. GitHub日收7000星,Windows计算器项目开源即爆红!
  2. linux循环读取文件里的ip,自动获取文件里IP的shell脚本
  3. hdu3786 Floyd或搜索 水题
  4. EventBridge消息路由|高效构建消息路由能力
  5. ionic overflow:auto失效
  6. 【转】oracle having -OCP-047-53
  7. HTTPS协议在Tomcat中启用的配置
  8. Java中的try/catch/finally
  9. java毕业设计——基于java+JSP+MyEclipse的网上订餐系统设计与实现(毕业论文+程序源码)——网上订餐系统
  10. java网店系统_java网店系统JSPGOU
  11. 网易云信服务监控平台实践
  12. 光线cms,如何增加像百度一样的智能提示
  13. 微博推荐算法学习(Weibo Recommend Algolrithm)
  14. Java/计算银行利率
  15. 图片加载 二维码 解析
  16. iOS 10 相关问题
  17. 【疯壳·无人机开发教程1】开源编队无人机-开机测试
  18. 数据挖掘的10大算法我用大白话讲清楚了,新手一看就懂
  19. poj3270Cow Sorting(置换+贪心)
  20. IDEA安装TFS插件

热门文章

  1. 优秀笔记课件——Google 及其它搜索引擎的高级使用
  2. 陕西师范大学第七届程序设计竞赛网络同步赛 J 黑猫的小老弟【数论/法拉数列/欧拉函数】...
  3. 光伏多峰最大功率点跟踪MPPT MATLAB/Simulink仿真模型
  4. QQ API 接口
  5. 多媒体在计算机的应用,计算机多媒体在教学中的应用
  6. 2018年9月柳叶刀杂志 深度学习技术解决肺炎分类检测问题 高分辨率CT扫描图 病例队列研究 翻译
  7. nova-week2
  8. 2021年建5G基站60万个;中兴遭减持;三大运营商2020年成绩单;电信发布新手机...
  9. 汇编语言-怎样查看标志位、怎样生成列表文件、列表文件格式
  10. lammps案例分析(2):石墨烯单轴拉伸之deform方式