多态以及它的单继承、多继承、菱形继承的对象模型

article/2025/10/25 19:10:32

什么是多态

同一件事物在不同的场景下表现忽的多种形态。不同类的对象对同一消息做出响应,同一消息可以根据发送对象的不同而采用多种不同的行为方式。

静态多态
在编译期间,确定程序的行为(确定具体调用哪个函数)
动态多态
程序运行期间,才能确定程序的运行行为
通常,虚函数是动态绑定,非虚函数是静态绑定,缺省参数值也是静态绑定

  • 实现动态多态的条件:
  1.基类中必须包含虚函数,在派生类中必须对基类中的虚函数进行重写。------例外:a>析构函数(函数名不同)b>协变:基类虚函数返回基类的引用/指针派生类函数返回派生类的引用/指针2.通过基类的指针/引用去调用虚函数
  • 那什么是重写呢?

    前提是:在继承体系中
    1.把基类中的某虚函数再在派生类中定义一个一样的虚函数,这个虚函数必须与基类中虚函数原型保持一致。
    2.派生类中函数virtual可以不写,仍旧保持虚函数特性
    3.基类与派生类虚函数的访问权限可以不同,但是基类中虚函数必须是公有的。

  • 什么是同名隐藏

    继承体系中,基类与派生类中具有相同名称的成员(成员变量或成员函数),当通过派生类对象调用相同名称的成员时,优先调用派生类。

这里写图片描述
注意:
virtual和static一样只能和函数的声明放在一块。
virtual不能和static放在一块。

多态的原理:

虚函数表:通过一块连续内存来存储虚函数的地址。按照虚函数在基类中的声明次序添加到虚函数表中。

//构造函数里插了一条语句,把虚表的地址放到类的前四个字节,如果没有给构造函数,自动合成一个。
//如果给了,什么也没有做,那编译器就把它改写了。
class Base
{
public:Base(){}virtual void FunTest1(){cout << "Base::FunTest1()" << endl;}int _b;
};
int main()
{Base b;return 0;
}

不同继承下,虚函数的对象模型

  • 1.单继承

    定义这样的基类和派生类:

class Base
{
public:Base(){}virtual void FunTest1(){cout << "Base::FunTest1()" << endl;}virtual void FunTest2(){cout << "Base::FunTest2()" << endl;}virtual void FunTest3()//加或者删了虚函数,记得重新生成解决方案{cout << "Base::FunTest3()" << endl;}int _b;
};
class Derived : public Base
{
public:virtual void FunTest5(){cout << "Derived::FunTest5()" << endl;}virtual void FunTest2(){cout << "Derived::FunTest2()" << endl;}virtual void FunTest4(){cout << "Derived::FunTest4()" << endl;}int _d;
};

把虚表打印出来:


typedef void(*PVTF)();//PVTF是void(*)()的别名
void PrintfVTF(Base& b,const string& str)//传基类引用的好处:传派生类和基类的对象都可以打印(赋值兼容规则)
{cout << str << endl;//先找到对象前四个字节,转换后在解引用,但是解引用后只是一个整数PVTF* pVTF = (PVTF*)*(int*)&b;while (*pVTF){(*pVTF)();//调这个函数pVTF++;}cout << endl;
}
int main()
{Base b;PrintfVTF(b,"Base VTF:");Derived d1;Derived d2;PrintfVTF(d1, "Derived VTF:");return 0;
}

这里写图片描述

一个类的多个对象共享同一张虚表:
这里写图片描述
对于重写的虚函数和没有重写的虚函数,是如何来调的:
这里写图片描述

  • 2.多继承
    首先,我们定义这样的基类和派生类:
    这里写图片描述

这里写图片描述
对于单继承来说,在派生类里没有重写的函数是在基类的虚表后面,那对于多继承,派生类里没有重写的函数是在哪个基类的虚表后面呢?
那我们把两个基类的虚函数表打印出来看看:

这里写图片描述
3.菱形继承
同样,我们声明这样的类:
这里写图片描述

对于菱形继承存在二义性问题,那我们把这个多态里的菱形继承让它虚拟继承,来看看对象模型:
这里写图片描述

现在我们来看,这连个地址哪个是虚表地址,哪个是偏移量表格地址:
这里写图片描述

所以,多态中的虚拟继承里,第一个地址是虚表地址,第二个地址是虚拟继承里偏移量表格的地址。


http://chatgpt.dhexx.cn/article/2FX996gY.shtml

相关文章

WEBBASIC Unit01 Web概述 、 HTML概述 、 文本处理 、 图像和超链接 、 表格 、 表单

一.课程介绍 1.HTML(1.5天) 勾勒出网页的结构和内容 2.CSS(3天) 美化网页 3.JavaScript(4天) 让网页呈现动态的数据和效果 4.jQuery(1.5天) 是一个框架,提高JS的开发效率 二.WEB概述 三.XML和HTML对比 1.XML 可扩展(自定义)标记语言标记、属性、标记之间的关系都可以…

HTML5_超链接、锚点、下载、表格、表格嵌套、列表、页面布局、表单

1、修改图片的高度和宽度 ● 1、如果要修改一张图片的尺寸&#xff0c;最好先算好宽度与高度的比例 ● 2、如果修改图片时 只修改宽度或者只修改高度时另一项属性会根据宽度或者告诉的缩放比例进行调整 2、PNG图片和JPG图片 PNG格式的图片 一般保存白色背景为透明色的图片…

js 点击table的某个单元格实现对应列的单元格变色

本文用于用js来实现&#xff1a;点击table的某个单元格实现对应列的单元格变色 一、表格CSS样式 <style>* {margin: 0;padding: 0;}table {width: 800px;height: 300px;}table,tr,td {border: 1px solid;border-collapse: collapse;}</style> 二、表格结构&#xf…

表格布局(TableLayout)及重要属性

TableLayout属性&#xff1a; android:collapseColumns:将TableLayout里面指定的列隐藏&#xff0c;若有多列需要隐藏&#xff0c;请用逗号将需要隐藏的列序号隔开。 android:stretchColumns:设置指定的列为可伸展的列&#xff0c;以填满剩下的多余空白空间&#xff0c…

Layout布局之表格布局

适用于多行多列的布局格式,每个TableLayout是由多个TableRow组成,一个TableRow就表示TableLayout中的每一行,这一行可以由多个子元素组成。实际上TableLayout和TableRow都是LineLayout线性布局的子类。但是TableRow的参数android:orientation属性值固定为horizontal,且andr…

前端表格排序插件TableSort资料整理

** 前端表格排序插件TableSort资料整理 ** 一、前言 项目实际开发中&#xff0c;经常会遇到对表格排序的需求&#xff0c;下面整理了几个常用的表格排序方法。 二、 常用插件 1、jquery.tablesorter.js &#xff0c; 用法参考这篇文章&#xff1a;https://www.cnblogs.co…

Type setting_latex 表格

彩色表格 [plain] view plain copy print ? \begin{table} </span></span></li><li class""><span>\centering </span></li><li class"alt"><span>\caption{彩色的表格} </span></li&…

JSB 原理与实践

大厂技术 坚持周更 精选好文 什么是 JSB 我们开发的 h5 页面运行在端上的 WebView 容器之中&#xff0c;很多业务场景下 h5 需要依赖端上提供的信息/能力&#xff0c;这时我们需要一个可以连接原生运行环境和 JS 运行环境的桥梁 。 这个桥梁就是 JSB&#xff0c;JSB 让 Web 端…

html一个带图片的表格,Html表格

&#xfeff;&#xfeff; 在解说今天Html表单之前。还是先看张图片来刺激一下。 源代码超链接演示 仿百度搜索框 请输入要搜索的内容&#xff1a; 看了上图百度的搜索页面&#xff0c;有木有心动一下&#xff0c;别慌你也能够的。这就是我们今天要讲的表单。 什么是Html表单—…

最新百度云不限速软件

直接放图不废话。 下载链接&#xff1a;https://pan.baidu.com/s/1ZDo6xMjMW525sH7FUB6QEA提取码&#xff1a;xey9

获取百度云盘不限速下载软件 每秒达到10兆 这叫一个“爽”

公众号内回复&#xff1a;不限速 即可获取下载链接 下载资源啦 永远也不需要开通VIP 赶快去下载吧 小编亲自体验下载速度 行走在岁月的小巷&#xff0c;听风&#xff0c;读雨&#xff0c;夜色空寂&#xff0c;一切烟云&#xff0c;皆会慢慢散去&#xff0c;光阴眷顾&a…

一款百度网盘不限速下载工具

此工具收集于网络&#xff0c;如有侵权请联系删除&#xff01;&#xff01;&#xff01; 此工具仅用于个人学习&#xff0c;请勿用于商业获利&#xff0c;造成后果自负&#xff01;&#xff01;&#xff01; 这款免费的百度云高速下载工具&#xff1a; 界面美观&#xff0c;…

百度云下载不限速方法+软件

转自&#xff1a;https://www.52pojie.cn/thread-888047-1-1.html 1、Pandownload这个不用多说&#xff0c;功能强大。目前是我的主力。 2、速盘速盘用得比较少&#xff0c;大致和pandownload差不多。 3、百度云下载神器这种就我个人来说比较鸡肋&#xff0c;需要在网页版的百度…

无封号风险,2020最新百度网盘不限速下载软件,下载速度10M/S

前不久给大家带来的卢本伟大神修改的pandownload不知道大家还在没在用&#xff0c;能不能用&#xff0c; 今天小七就在给大家带来一款度盘高速下载工具&#xff0c;软件完全免费并且没有任何下载限制&#xff0c;而且相比pandownload需要登录百度账号&#xff0c;这款软件无需…

Linux下载工具photon,不限速、免配置的 Aria2 免费开源下载软件 Photon,替代迅雷的...

原标题&#xff1a;不限速、免配置的 Aria2 免费开源下载软件 Photon&#xff0c;替代迅雷的 谈到下载软件除迅雷、IDM 之外&#xff0c;想必很多人都听过 Aria2 的大名&#xff0c;它绝对是跨平台不限速的“神器级”下载工具&#xff0c;可由于它是「命令行」软件&#xff0c;…

百度云下载不限速方式集合

因为百度云限速严重&#xff0c;因此很多时候都是在寻找相应的工具去破解百度云&#xff0c;这里整理一下自己一般用的一些工具的方法。&#xff08;有些方式有些时候会被官方和谐&#xff0c;因此多试几种&#xff09; 文章目录 1、使用第三方工具pandownload2、使用油猴脚本配…

解决微云下载限速问题

1.首先将文件存到微云 2.打开手机我的设备&#xff0c;我的电脑&#xff08;也可以是好友&#xff09;&#xff0c;找到发送文件 3.点击微云&#xff0c;找到微云里面的文件&#xff0c;点击发送 4.就可以在电脑端不限速下载了 注意但是好像根据很多人的反馈4GB以上的好像发不过…

【更新】网盘不限速下载 2021.01.13

哈喽大家好嘞&#xff01; 最近一直都有好多朋友们反馈&#xff0c; 以往的百度网盘都不能用了&#xff0c; 安排&#xff0c;这就安排。 大家在学习知识的同时&#xff0c;不要忘记点赞呦&#xff01; ★ KinhDown 搜集了全网&#xff0c;可算是找到了一个能用的&#xf…

android http下载限速,安卓手机端两种让网盘不限速下载方法介绍

百度网盘已然成为分享型网盘中一家独大的“大佬”了。时代就是这样不管你喜不喜欢&#xff0c;上网总会遇到些百度网盘共享的文件需要下载。然而&#xff0c;百度网盘对免费用户的限速已经到了“感人”的地步了&#xff0c;常常十多KB/秒的速度真能让人崩溃&#xff01;虽说会员…

百度云盘不限速下载工具(附带开源源码)

百度下载资源限速? 进来看完摆脱束博&#xff01; 软件名称&#xff1a;antdownload 软件大小&#xff1a;21.4M 软件介绍&#xff1a; antdownload中文名蚂蚁下载器&#xff0c;是由Recursion开发的百度文件无限速批量下载器。软件支持解析百度用户分享网盘链接&#xff…