- ubuntu12.04环境下使用kvm ioctl接口实现最简单的虚拟机
- Ubuntu 通过无线网络安装Ubuntu Server启动系统后连接无线网络的方法
- 在Ubuntu上搭建网桥的方法
- ubuntu 虚拟机上网方式及相关配置详解
CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.
这篇CFSDN的博客文章C++之多态(内容不错)由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.
编译环境:WIN10 VS2017 。
这篇博客有点长,但都是满满的干货,一定要看到最后,那才是重点.
什么是多态?
顾名思义就是同一个事物在不同场景下的多种形态.
下面会具体的详细的介绍.
静态多态 。
我们以前说过的函数重载就是一个简单的静态多态 。
可以看出来,静态多态是编译器在编译期间完成的,编译器会根据实参类型来选择调用合适的函数,如果有合适的函数可以调用就调,没有的话就会发出警告或者报错。。。比较简单,不做多介绍.
动态多态 。
什么是动态多态呢? 动态多态: 显然这和静态多态是一组反义词,它是在程序运行时根据基类的引用(指针)指向的对象来确定自己具体该调用哪一个类的虚函数.
我在西安临潼上学,我就以这边的公交车举个栗子啊:
这就是一个简单的动态多态的例子,它是在程序运行时根据条件去选择调用哪一个函数。 而且,从上面的例子我们还发现了我在每一个函数前都加了virtual这个虚拟关键字,想想为什么?如果不加会不会构成多态呢? 干想不如上机实践:
在调用FuncTest2的时候我们看出来他并没有给我们调用派生类的函数,因此我们可以对动态多态的实现做个总结.
动态多态的条件:
●基类中必须包含虚函数,并且派生类中一定要对基类中的虚函数进行重写。 ●通过基类对象的指针或者引用调用虚函数.
重写 :
(a)基类中将被重写的函数必须为虚函数(上面的检测用例已经证实过了) (b)基类和派生类中虚函数的原型必须保持一致(返回值类型,函数名称以及参数列表),协变和析构函数(基类和派生类的析构函数是不一样的)除外 (c)访问限定符可以不同 那么问题又来了,什么是协变? 协变:基类(或者派生类)的虚函数返回基类(派生类)的指针(引用) 总结一道面试题:那些函数不能定义为虚函数? 经检验下面的几个函数都不能定义为虚函数: 1)友元函数,它不是类的成员函数 2)全局函数 3)静态成员函数,它没有this指针 3)构造函数,拷贝构造函数,以及赋值运算符重载(可以但是一般不建议作为虚函数) 。
抽象类:
在前面公交车的例子上我提了一个问题:
在成员函数(必须为虚函数)的形参列表后面写上=0,则成员函数为纯虚函数。包含纯虚函数的类叫做抽象类(也叫接口类),抽象类不能实例化出对象。纯虚函数在派生类中重新定义以后,派生类才能实例化出对象。纯虚函数是一定要被继承的,否则它存在没有任何意义.
多态调用原理 。
8?不知道大家有没有问题,反正我是有疑惑了。以前在对象模型(https://blog.csdn.net/qq_39412582/article/details/80808754)时我提到过怎么来求一个类的大小。按照那个方法,这里应该是4才对啊,为什么会是8呢?
通过观察。我们发现这个例子里面和以前不一样,类成员函数变成了虚函数,这是不是引起类大小变化的原因呢? 我们假设就是这样,然后看看内存里是怎么存储的呢?
可以看到它在内存里多了四个字节,那这四个字节的内容到底是什么呢?
是不是有点看不懂,我们假设它是一个地址去看地址里存的东西的时候发现它存的是两个地址。 我假设它是虚函数的地址,我们来验证一下:
结果好像和我们的猜想一样,是一件开心的事。然后我给一张图总结一下:
在反汇编中我们还可以看到,如果含有虚函数的类中没有定义构造函数,编译器会自动合成一个构造函数 。
对于派生类的东西我给个链接仔细看,人家总结的超级赞,我偷个懒就不写了,老铁们包容下啊.
派生类虚表:
1.先将基类的虚表中的内容拷贝一份 2.如果派生类对基类中的虚函数进行重写,使用派生类的虚函数替换相同偏移量位置的基类虚函数 3.如果派生类中新增加自己的虚函数,按照其在派生类中的声明次序,放在上述虚函数之后 。
https://coolshell.cn/articles/12176.html 。
多态缺陷 。
●降低了程序运行效率(多态需要去找虚表的地址) ●空间浪费 。
原文链接:https://blog.csdn.net/qq_39412582/article/details/81628254 。
最后此篇关于C++之多态(内容不错)的文章就讲到这里了,如果你想了解更多关于C++之多态(内容不错)的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
我来自 Asp.Net 世界,试图理解 Angular State 的含义。 什么是 Angular 状态?它类似于Asp.Net中的ascx组件吗?是子页面吗?它类似于工作流程状态吗? 我听到很多人
我一直在寻找 3 态拨动开关,但运气不佳。 基本上我需要一个具有以下状态的开关: |开 |不适用 |关 | slider 默认从中间开始,一旦用户向左或向右滑动,就无法回到N/A(未回答)状态。 有人
我是一名优秀的程序员,十分优秀!