C++多态性的总结

2023-05-16

抽空总结下对一直以来对C++多态性的一点个人理解:


1.什么叫早绑定和晚绑定?  

早绑定指在对象声明的时候就和它的类型建立了关联。
晚绑定是指代码在运行时再检查对象是否提供了我们所需要的方法和属性。

静态关联(早绑定)和动态关联(晚绑定)。

 

2.什么叫多态性?

一个接口,多种方法。

 

3.多态性和非多态性的区别?

多态与非多态的实质区别就是函数地址是早绑定还是晚绑定。如果函数的调用,在编译器编译期间就可以确定函数的调用地址,并产生代码,是静态的,就是说地址是早绑定的。而如果函数调用的地址需要在运行时才确定,这就属于晚绑定。

 

4.一个不带虚函数的类(无成员变量)大小?

空类大小不为0,为1。

 

5.一个带虚函数的类(无成员变量)大小?

其对象会产生一个虚函数表,,相当于多了一个指针型的成员变量,在有成员变量时也同样要考虑,比如含一个char型成员变量,带一个或几个(多少个也只有一个虚表)虚成员函数,都相当于含一个char, 一个指针,sizeof()大小为8。

 

6.能不能在构造函数中调用虚函数?

在构造函数中调用虚函数时,采用早绑定,也就是虚函数机制在构造函数中不工作。

在C++构造函数中,虚函数调用会被编译器自动转为普通函数调用。

 

7.为什么构造函数不能为虚函数?

1. 编译器在构造对象时,必须知道确切的类型,才能正确的生成对象,因此不能采用晚绑定。

2. 由虚函数机制可以知道,在构造函数执行前,对象中的虚函数表指针并没有正确的初始化,无法使用虚函数表来调用构造函数。

3. 在C++中,一个类如果有多个构造函数,构造函数不能调用其他的构造函数。

 

8.纯虚函数和虚函数区别?

 

纯虚函数就是只声明了有这种函数 但不会给出这个函数的内容 所以任何继承了这个函数的子类的成员函数都必须定义这个函数的内容,如

果不定义,则子类也是抽象类,无法生成对象。

虚函数 声明了有这种函数 而且给除了这个函数的内容 任何继承了这个函数的子类成员函数 如果本身没有定义这个函数的内容 就采用基类

的这个函数 如果子类重新定义了了这个函数 那么通过基类的指针就能过根据对象来判断选择哪个函数 。

9.虚函数怎么定义?

只需要在声明前加virtual,不需要在定义时加,一旦基类的某个函数成为虚函数,子类对应的函数不需要加virtual,也会自动成为虚函数,

当然子类的子类对应的函数也会自动成为虚函数。

10.下面重点理解虚函数:

[cpp] view plain copy print ?
  1. class A  
  2. {  
  3. public:  
  4.     virtual void  Say() ;  
  5.      virtual~A(){cout<<"~A"<<endl;}  
  6. };  
  7. void A::Say(){cout<<"A Say"<<endl;};  
  8. class B:public A  
  9. {  
  10. public:  
  11.     void Say(void);  
  12.     ~B(){cout<<"~B"<<endl;}  
  13. };  
  14. void B::Say(void){cout<<"B Say"<<endl;}  
  15. int _tmain(int argc, _TCHAR* argv[])  
  16. {  
  17.     A *p = new B ;  
  18.     p->Say() ;  
  19.     delete p;  
  20.     system("pause") ;  
  21.     return 0 ;  
  22. }  

1.虚函数的作用是晚绑定,如上例,A *p = new B ;p->Say() ;如果Say()是虚函数,则会在运行时动态选择合适的对象Say(),如果不是虚函数,则只会选择A的Say(),要明白一点,如果不是动态链接的,如B b;b.Say();,这是静态的,编译器在编译就知道应该调用B的Say(),那么是不是虚函数都无所谓的,
2.析构函数最好声明为虚函数,这是针对new对象来说的,如上例,A *p = new B ,如果不用delete p;,那么A和B的析构函数肯定都不会被调用,如果用了delete p,但析构函数不是虚函数,则只会调用A的析构函数,不会调用B的析构函数,这其实和2是同一道理,如果析构函数是虚函数,则调用B的析构函数再调用A的析构函数。
3.无论析构函数是不是虚函数,如果用B b这种静态声明,都会先调用B的析构函数再调用A的析构函数

转载于:https://www.cnblogs.com/sjlove/p/3168593.html

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C++多态性的总结 的相关文章

  • [微信小程序系列] 动画案例之圆点沿着圆圈运动

    作者 xff1a 滴滴公共前端团队 Tawnia 滴滴作为第一批的小程序开发者 xff0c 我们也大量地用到了动画 xff0c 积累了一些经验 xff0c 由于市面上的小程序动画案例很少 xff0c 我们也分享一部分我们做过的案例 xff1
  • Vue Iview Tree插件的无限层

    Iview lt template gt lt Tree data 61 34 baseData 34 show checkbox multiple gt lt Tree gt lt template gt lt script gt exp
  • React Component vs React Element

    React Component vs React Element 有这样的一个问题 xff1a 方法定义 function add x y return x 43 y 方法调用 add 1 2 组件定义 class Icon extends
  • 手把手学STM32(一)

    手把手学STM32 一 构建工程 这篇文章详细的介绍编写第一个固件工程 xff08 F103ZET6版本的 xff09 文档里的操作部分我使用了黄色背景色标出 xff0c 如觉麻烦 xff0c 可直接参考黄色部分 资料下载链接 xff1a
  • Linux下查看在线用户及用户进程

    可采用命令 xff1a w who last users finger 需yum安装 法一 xff1a root 64 test1 who root tty1 2015 08 19 23 15 lxh pts 0 2015 08 20 00
  • 手动制作一个QQ群机器人

    为什么80 的码农都做不了架构师 xff1f gt gt gt 最近在群里面一个朋友在玩机器人 我觉得蛮有意思的所以查了下资料搞了一个机器人 这里只是借助软件实现机器人 后面会自己去手写一个机器人 1 进入图灵的官网 http www tu
  • X-Content-Type-Options: nosniff

    如果服务器发送响应头 34 X Content Type Options nosniff 34 xff0c 则 script 和 styleSheet 元素会拒绝包含错误的 MIME 类型的响应 这是一种安全功能 xff0c 有助于防止基于
  • 过期域名

    tonha sx cn wqk410 sx cn liyongfu2005 sx cn id 3682362 sx cn dtsgfljdsbyxzrgs sx cn id 1184965 sx cn jinlei001 sx cn lin
  • CSS之 background-color: rgba(255,0,0,opacity number)

    一 xff1a backgrounde color xff1a rgba xff08 xff09 设置背景色的时候 xff0c 可以调节背景色的透明度 xff0c 注意是背景哦 xff0c 所以不会存在遮罩问题 见图 test cover
  • PrestaShop 网站后台配置(三)

    转载请注明出处 xff1a http www cnblogs com zhong dev p 4942957 html 网店版本 v1 6 这一篇文章主要介绍 前台显示模块 的调整 1 xff1a top banner xff08 首页横幅
  • 正则表达式

    Date 2019 07 03 Author Sun 本节目的 xff1a xff08 1 xff09 掌握正则表达式和re模块使用 xff08 2 xff09 python操作正则表达式 xff0c 匹配贪婪和非贪婪模式使用 xff08
  • asp.net mvc 部署时出现错误 没有对“C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\Temporary ASP.NET Files”的写访问权限...

    在IIS中 发布程序一个ASP NET程序 xff0c 通过IE访问报如下错误 xff1a 当前标识 NT AUTHORITY NETWORK SERVICE 没有对 C WINDOWS Microsoft NET Framework v2
  • 事件的好处~实现对修改的封闭,对扩展的开放

    事件是这样的 xff0c 我觉得用事件来做这事比较好 xff0c 它很好的遵循了 开闭原则 xff0c 当然这并不是最重要的 xff0c 最重要的应该是它更符合程序开发的原则 场合 xff1a 一个订单处理问题 xff0c 一个订单的产生可
  • 中文显示不全?docker+ firefox

    2019独角兽企业重金招聘Python工程师标准 gt gt gt sudo apt get install ttf wqy microhei ttf wqy microhei ttf wqy zenhei kde l10n zhcn xf
  • FreeRTOS 移植,问题总结

    一直没亲手移植过FreeRTOS xff0c 心血来潮移植了下最新版的FreeRTOSv202104 00 过程不赘述 xff0c 可以参考 https www cnblogs com iot dev p 11681067 html xff
  • Linux常见的进程调度算法

    进程调度 xff1a 在操作系统中调度是指一种资源分配 调度算法是指 根据系统的资源分配策略所规定的资源分配算法 操作系统管理了系统的有限资源 xff0c 当有多个进程 或多个进程发出的请求 要使用这些资源时 xff0c 因为资源的有限性
  • 无人机行业应用分类有哪些?

    创客的集结号已吹响 随着无人机技术的发展 xff0c 细分市场领域的需求增长 xff0c 无人机的应用正展现出越来越丰富的可能性 航拍 植保 xff0c 替代电力工人巡线等等 xff0c 无人机的应用越来越广泛 xff0c 正推动着各个领域
  • ROS初级教程 cmake cmakelist.txt 的编写教程

    有很多 的时候我们使用别人的程序包 然后添加东西的时候缺少什么东西 xff0c 会使程序编译不过去 xff0c 甚至无法运行 xff0c 接下来介绍一下cmakelist txt 的每一行的作用 为了以后添加和修改方便 2 整体结构和订购
  • linux下串口应用开发

    为什么80 的码农都做不了架构师 xff1f gt gt gt 据通信的基本方式可分为并行通信与串行通信两种 并行通信是指利用多条数据传输线将一个资料的各位同时传送 它的特点是传输速度 快 xff0c 适用于短距离通信 xff0c 但要求传
  • echarts导入本地数据_Excel办公实操,导入本地数据,常用小技巧操作方式

    导入Excel表数据 有的时候用户希望根据一定的条件从外部数据源中有选择地导入部分数据 xff0c 可以使用Excel的Micsoft Query功能来完成这项工作 图 所示的是一个名为 示例 的 Excel 工作簿文档 xff0c 当前工

随机推荐