| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> C++知识库 -> C++多态2----多态实现原理 -> 正文阅读 |
|
[C++知识库]C++多态2----多态实现原理 |
文章目录1 . 多态原理c++多态1—基础知识和概念
通过观察测试我们发现b1对象大小是8bytes,因为除了m_base成员,还多一个__vfptr放在对象的前面(有些平台可能会放到对象的最后面,这个跟平台有关),这个指针就是虚函数表指针(v代表virtual,f代表function),因为虚函数的地址要被放到虚函数表中,虚函数表也简称虚表。一个含有虚函数的类中都至少都有一个虚函数表指针(单继承只有一个虚函数表指针), == 首先需要了解的是:只要函数被声明为虚函数就会被记录在虚表中。 当有派生类重写了父类的虚函数,并且通过基类的指针或引用调用了该函数就会形成多态。 总结一下派生类的虚表生成:
2虚表和虚函数的存储这小节和下一小节分内容参考文章C++ 虚函数表解析,讲解的比较清晰,方便学习使用。 虚函数和普通函数一样的,都是存在代码段的,只是他的指针又存到了虚表中,虚表也存在代码段。另外对象中存的不是虚表,存的是虚表指针。
注意:这里在虚函数表的最后多加了一个结点,这是虚函数表的结束结点,就像字符串的结束符“\0”一样,其标志了虚函数表的 结束。这个结束标志的值在不同的编译器下是不同的。 3.单继承和多继承关系的虚函数表3.1单继承(无虚函数覆盖)下面,再让我们来看看继承时的虚函数表是什么样的。假设有如下所示的一个继承关系: 请注意,在这个继承关系中,子类没有重载任何父类的函数。那么,在派生类的实例中,其虚函数表如下所示: 我们可以看到下面几点: 3.2 单继承(有虚函数覆盖)覆盖父类的虚函数是很显然的事情,不然,虚函数就变得毫无意义。下面,我们来看一下,如果子类中有虚函数重载了父类的虚函数,会是一个什么样子?假设,我们有下面这样的一个继承关系。 为了让大家看到被继承过后的效果,在这个类的设计中,我只覆盖了父类的一个函数:f()。那么,对于派生类的实例,其虚函数表会是下面的一个样子: 我们从表中可以看到下面几点,
由b所指的内存中的虚函数表的f()的位置已经被Derive::f()函数地址所取代,于是在实际调用发生时,是Derive::f()被调用了。这就实现了多态。 3.3 多继承(无虚函数覆盖)下面,再让我们来看看多重继承中的情况,假设有下面这样一个类的继承关系。注意:子类并没有覆盖父类的函数。 我们可以看到: 3.4 多重继承(有虚函数覆盖)下面我们再来看看,如果发生虚函数覆盖的情况。 下面是对于子类实例中的虚函数表的图: 我们可以看见,三个父类虚函数表中的f()的位置被替换成了子类的函数指针。这样,我们就可以任一静态类型的父类来指向子类,并调用子类的f()了。如:
4 动态绑定与静态绑定
5 抽象类
|
|
C++知识库 最新文章 |
【C++】友元、嵌套类、异常、RTTI、类型转换 |
通讯录的思路与实现(C语言) |
C++PrimerPlus 第七章 函数-C++的编程模块( |
Problem C: 算法9-9~9-12:平衡二叉树的基本 |
MSVC C++ UTF-8编程 |
C++进阶 多态原理 |
简单string类c++实现 |
我的年度总结 |
【C语言】以深厚地基筑伟岸高楼-基础篇(六 |
c语言常见错误合集 |
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/24 4:19:22- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |