c++继承下

2023-10-29

继承的方式主要分为单继承、多继承、菱形继承。


普通单继承:

指向派生类的基类指针或者引用,其类型仍然属于基类类型,而不是派生类类型

#include<iostream>
using namespace std;

class Base
{
public:
	 void fun()
	{
		cout << "Base->fun()" << endl;
	}

	void foo()
	{
		cout << "Base->foo()" << endl;
	}
};


class Derived :public Base
{
public:
	 void fun()
	{
		cout << "Deriver->fun()" << endl;
	}

	void foo()
	{
		cout << "Derived->foo()" << endl;
	}
};


void TestOnlyInherit()
{
	Base b;
	Derived d;
 
	Base *p = &b;
	p->foo();
	p->fun();

	p = &d;
	p->foo();
	p->fun();
}




带有虚函数的单继承:

#include<iostream>
using namespace std;

class Base
{
public:
	virtual void fun()
	{
		cout << "Base->fun()" << endl;
	}

	void foo()
	{
		cout << "Base->foo()" << endl;
	}

	int a;
};


class Derived :public Base
{
public:
	virtual void fun()
	{
		cout << "Deriver->fun()" << endl;
	}

	void foo()
	{
		cout << "Derived->foo()" << endl;
	}
	int b;
};


void TestOnlyInherit()
{
	Base b;
	Derived d;
 
	Base *p = &b;
	p->foo();
	p->fun();

	p = &d;
	p->foo();
	p->fun();
}

Base->foo()--------基类指针指向一个派生类对象,指针p指向固定偏移量的函数。

Derived->fun()-------基类指针指向派生类对象,此时,指针p通过调用一个派生类对象来调用一个虚函数, p通过虚函数表来找到相应的函数的地址。


带虚继承的多继承:

#include<iostream>
using namespace std;

class Base1
{
public:
	virtual void A()
	{}

	virtual void B()
	{}

	int a;
};

class Base2
{
	virtual void C()
	{}

	virtual void D()
	{}

	int b;
};

class Derived1 :public Base1, public Base2
{
public:
	virtual void E()
	{}

	virtual void F()
	{}

	int c;
};

void Printf(int* VTable)
{
	cout << "虚表地址:" << VTable << endl;

	for (int i = 0; VTable[i] != 0; ++i)
	{
		cout << "第%d个虚表地址:0x%x,->" << i << VTable[i] << endl;
	}
}

void TestMoreInherit()
{
	Base1  b1;
	Base2 b2;
	Derived1 d1;
	int* VTable1 = (int*)(*(int*)&b1);
	int* VTable2 = (int*)(*(int*)&b2);
	int* VTable3 = (int*)(*(int*)&d1);

	Printf(VTable1);
	Printf(VTable2);
	Printf(VTable3);
}


我们可以很明显的看出,基类Base1和Base2的虚函数地址不同,也就是说他们没有共用一张虚表。

而Base1和Derived的虚函数收地址相同,所以我们可以大胆假设,Base1和Derived共用了同一张虚函数表。并且,Derived的虚函数地址被放在了Base1的虚函数表的后面。

带虚继承的菱形继承:

#include<iostream>

using namespace std;

class A
{
public:
	virtual void fun1()
	{
		cout << "A->fun1" << endl;
	}
	virtual void fun2()
	{
		cout << "A->fun2" << endl;
	}
	int a;
};

class B1:public A
{
public:
	virtual void fun1()
	{
		cout << "B1->fun1" << endl;
	}
	virtual void fun3()
	{
		cout << "B1->fun3" << endl;
	}
	int b1;
};

class B2 :public A
{
public:
	virtual void fun2()
	{
		cout << "B2->fun2" << endl;
	}
	virtual void fun4()
	{
		cout << "B2->fun4" << endl;
	}
	int b2;
};

class C :public B1, public B2
{
public:
	virtual void fun3()
	{
		cout << "C->fun3" << endl;
	}
	virtual void fun4()
	{
		cout << "C->fun4" << endl;
	}
	virtual void fun5()
	{
		cout << "C->fun5" << endl;
	}
	int c;
};

void Printf(int* VTable)
{
	cout << "虚表地址:" << VTable << endl;

	for (int i = 0; VTable[i] != 0; ++i)
	{
		cout << "第%d个虚表地址:0x%x,->" << i << VTable[i] << endl;
	}
}

void Test()
{
	A  a;
	B1 b1;
	B2 b2;
	C c;
	int* VTable1 = (int*)(*(int*)&a);
	int* VTable2 = (int*)(*(int*)&b1);
	int* VTable3 = (int*)(*(int*)&b2);
	int* VTable4 = (int*)(*(int*)&c);

	Printf(VTable1);
	Printf(VTable2);
	Printf(VTable3);
	Printf(VTable4);
}


由图可见,菱形继承与多继承很相似。


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

c++继承下 的相关文章

  • 基于Sketch Up软件校园建模案例分享

    Acknowledgements 由衷感谢覃婉柔 赵泽昊同学在本次课程实习中做出的巨大贡献 感谢本团队成员一起努力奋斗的岁月 一 建模地点 中国地质大学 武汉 未来城校区图书馆周边 中国地质大学 武汉 未来城图书馆介绍 图书馆位于中国地质大
  • unity不同分辨率适配摄像机

    竖屏游戏的时候 unity中摄像机是自动上下适配的 也就是说在不同分辨率下看到的上下看到的世界范围是一致的 比如在iphone6正常 那么在iphoneX上就有一种放大的效果 而正常的情况是在iphoneX上看到的宽度应该是一致的 也就是说
  • Html5 播放实时音频流

    Html5 播放实时音频流 项目需求 Web端播放实时音频流 折腾了两天后问题得以解决 记录下开发调试过程 方便后来者 首次想到是利用Audio标签 Audio标签可以直接播放MP3格式 服务端将实时音频流编码成MP3格式 通过Http方式
  • 力软敏捷开发框架7.0.6源码

    力软敏捷开发框架真正源码 从我所看到的情况来看 如今敏捷软件开发被广泛误解了 许多人认为敏捷 他们只需要像scrum这样的过程即可定义sprint和迭代的框架 他们会不断冲刺 直到精疲力尽 然后改变直至停滞 但是 当您问他们面向对象设计的原
  • React 16官网 (main concepts) 浏览

    翻译一下官网 顺便了解一下React 16版本的新特性 照旧 从Hello World开始 ReactDOM render h1 Hello world h1 document getElementById root 在集成了React的必
  • 母版页使用问题(显示系统时间 js)

    在使用母版页的时候 发现源文件控件元素的ID和生成HTML文件的ID不一致 表单from的name属性和id属性变成了aspnetForm 控件的id属性被无缘无故了加上了ctl00 ContentPlaceHolder1 前缀 其name
  • 基于Arduino nano 的6路循迹小车

    define leftA PIN 7 define leftB PIN 6 define left Pwm PIN 5 define STBY 8 define rightA PIN 9 define rightB PIN 10 defin
  • python经典练习十道(四)

    1 请输入星期几的第1个字母 用来判断是星期几 如果第1个字母一样 则继续判断第2个字母 以此类推 week Sunny Monday Tuesday Wednesday Thursday Friday Saturday while Tru
  • node搭建一个简单的脚手架

    一 什么是脚手架 脚手架 Scaffold 是指在软件开发过程中为提高开发效率而提供的一套基础代码结构 组织规范 开发工具和工程化配置的工具 脚手架可以帮助开发团队快速搭建项目的基础框架 规范项目的开发流程 并提供一些常用的功能和工具 脚手
  • mpvue返回页面,当前页面数据不会清空

    遇到问题 使用mpvue时 编辑页面会将数据加载到页面上 点击返回 新增页面时 进入的同一页面会发现数据仍然在 页面没有被卸载 数据没有清空 解决方案 在进入页面时 在生命周期内重置data数据 mounted Object assign
  • vue,elementui更改文件名下载,并添加el-progress进度条

    功能 vue elementui更改文件名下载 下载添加el progress进度条 需求 公司需要下载fastdfs文件系统文件 通过http方式 并修改下载的文件名 ps 跨域问题通过配置nginx解决 下载组件代码如下
  • 基于BC-linux/Centos下的K8S单机环境搭建

    搭建前环境准备 配置虚拟机 详细的配置流程比较简单 这里就直接放配置完成的设置 处理器是4个单核 内存是8G 硬盘空间是60G 重点是网络适配器选择NAT模式 另外这里的镜像是选择的BC linux 基于Centos下的 版本是7 6的 下
  • TCP拥塞控制

    拥塞 在某段时间 若对网络中某资源的需求超过了该资源所能提供的可用部分 网络的性能就要变坏 产生拥塞 congestion 拥塞原因 某结点缓存容量太小 某链路带宽不足 某些处理机处理效率太慢 拥塞会累积 不断加剧 增加资源并不能从根本上解
  • QtXlsx编译、使用笔记

    换个方式操作ms office excel 第一次知道QtXlsx 记录一下使用方式 项目地址 http qtxlsx debao me 网上说的编译方式没搞定 vs2013 qt5 5 1加入pro文件 pri文件 都失败 用了一个简单方
  • IIS安装配置和简单网站部署流程

    IIS安装和网站配置 环境 win10 注意 这是在win10下部署iis 开发环境下部署 开发测试 非windows server IIS简介 Internet Information Services 简称IIS 是微软提供基于wind
  • 零基础小白如何入门python爬虫?3年程序员分享python爬虫学习攻略(文内有福利)

    如果你是非计算机专业 完全是零基础编程 这篇文章就是专门为你写的 内容不长 2分钟就能看完 但还是希望能给你一些帮助 以前从纯白零基础学Python 很多坑都没人踩 现在经常看到很多Python学习群里的新朋友总是喊着 从入门到放弃 觉得学
  • 【ROS】ROS1人机界面开发:在QtCreator中创建ROS1功能包

    ROS 郭老二博文之 ROS目录 1 版本要求 ROS的QtCreator插件要和QtCreator版本对应一致 否则报错 本人QtCreator版本为 10 0 1 需要下载安装ros qtc plugin的版本也要为10 0版本 2 安
  • 用Python绘制地理图

    当您的数据包含地理信息时 丰富的地图可视化可以为您理解数据和解释分析结果的最终用户提供重要价值 Plotly Plotly是一个著名的库 用于在Python中创建交互式绘图和仪表板 安装Plotly 在命令提示符中运行这两个命令 以在我们的
  • 六、windows环境下netcat的安装及使用

    windows环境下netcat的安装及使用 s小菜鸟 2019 01 03 21 05 51 5080 收藏 14 1 下载netcat 下载地址 https eternallybored org misc netcat 2 解压文件 3

随机推荐

  • Java中的NIO编程

    1 BIO和NIO简介 BIO NIO AIO简介 1 Java BIO 同步并阻塞 传统阻塞型 服务器实现模式为一个连接一个线程 即客户端有连接请求时服务器端就需要启动一个线程进行处理 如果这个连接不做任何事情会造成不必要的线程开销 2
  • 中国天气网全城市代码weather_cityId

    Ctrl F 查询 城市名字 http mobile weather com cn data forecast 101010100 html 1381891660081 北京 gt 101010100 海淀 gt 101010200 朝阳
  • 【openWrt】自定义后台访问端口

    通过ssh访问openwrt系统 修改 ect config uhttpd文件 再重启openwrt即可
  • 无人不苦,不必喊疼

    张爱玲说 生活是一袭华美的长袍 里面爬满了虱子 对于大多数人来说 生活都是外面光鲜亮丽 里面却各有各的苦楚 尤其对于成人 更是早已被生活的风霜 侵袭得体无完肤 可是 生活再不易 也总要拼尽了全力往前走 才能趟过荆棘丛生 走上康庄大道 1成人
  • ArrayList源码分析(基于JDK11)

    ArrayList源码分析 基于JDK11 类字段 private static final long serialVersionUID 8683452581122892189L private static final int DEFAU
  • JMETER:Uncaught exception in thread Thread

    Uncaught exception in thread Thread AWT EventQueue 0 6 main 调用测试片段错误 循环调用了
  • Jmeter中正则表达式提取器使用详解

    转载地址 http blog csdn net quiet girl article details 50724313 在使用Jmeter过程中 会经常使用到正则表达式提取器提取器 虽然并不直接涉及到请求的测试 但是对于数据的传递起着很大的
  • linux查看磁盘io性能

    1 查看磁盘 IO 性能 1 1 top 命令 top 命令通过查看 CPU 的 wa 值来判断当前磁盘 IO 性能 如果这个数值过大 很可能是磁盘 IO 太高了 当然也可能是其他原因 例如网络 IO 过高等 1 2 sar 命令 sar
  • Jupyter Notebook使用-如何设置代码单元启用自动换行

    最近开始使用 Jupyter Notebook 至于它的强大功能不需要我做过多介绍 接下来直接进入正题 在使用的过程中我发现了一个这样的问题 当编辑的代码过长时将会出现滚动条 滑动条 像下面这样 但是当我将滚动条拉到底时 问题出现了 侧边栏
  • 代码审计-Java项目&JDBC&Mybatis&Hibernate&注入&预编译&写法

    文章目录 Javaweb 数据库操作 模式 写法 预编译等 环境搭建 JDBC 注入分析 关于预编译 Mybatis 注入分析 Hibernate 注入分析 总结 Javaweb 代码审计SQL注入 INXEDU在线网校 Javaweb 数
  • python构建IP代理池(Proxy Pool)

    基本原理 代理实际上指的就是代理服务器 它的功能是代理网络用户去取得网络信息 也可以说它是网络信息的中转站 在我们正常请求一个网站时 是将请求发送给 Web 服务器 Web 服务器把响应传回给我们 如果设置了代理服务器 实际上就是在本机和服
  • 多数据源配置(application.properties或application.yml配置详情)

    1 导入Maven依赖
  • ssh key问题解决

    u r the butter of my bread the breath to my life Julie Julia 某些情况下 原来的ssh连接会失效 比如误删了 ssh下面的东西 这时 需要重新生成key并加入gitlab或gith
  • 列表的基本操作

    描述 在两行中分别输入一个字符串 分别将其转换为列表 a 和 b 按要求完成以下功能 1 输出两个列表的拼接结果 2 输出列表 a 重复3次的结果 3 输出列表 b 中第3个元素和最后一个元素 4 输出列表 a 中序号1至4之间的元素 5
  • git工具下载

    文章目录 下载客户端 git下载教程 git下载地址 Tortoise下载地址 Tortoise下载教程 Git以及Github详细解析教程 码云学习安装视频 下载客户端 git下载教程 https www cnblogs com xuew
  • Android 使用updatefun 来自动更新

    这几天研究了一下APP的自动更新 并且是那种最方便使用的 找了一下 找到一个框架 updatefun 使用方法比较简单 记录一下使用方法和遇到的问题 使用步骤 1 使用Android studio 的依赖方式 dependencies co
  • 快速定位当前页面的Activity

    方法1 通过AndroidStudio的Terminal 利用一个指令可以快速定位当前页面的类名 1 把手机用数据线连到电脑 手机打开到需要的定位的页面 2 打开AndroidStudio 在AndroidStudio底部选择Termina
  • 实现一个简单的python小脚本的一些必要步骤

    1 编写python代码时在开头添上 python27 2 设置环境变量路径 在系统变量path中新建一个你要运行python脚本的文件夹的绝对路径 D python 3 运行方式 a 直接双击xx py文件 b 添加环境变量后 在cmd中
  • 工程有限元(1)

    有限法的基本思想 有限元概述 结构分析问题 有限元法的思路 有限元法的一般步骤 本文内容是整理的 工程有限元 课程内容 便于日后复习以及读者学习 有限元概述 有限元法 Finite Element Anaslysis FEM 是通过数学描述
  • c++继承下

    继承的方式主要分为单继承 多继承 菱形继承 普通单继承 指向派生类的基类指针或者引用 其类型仍然属于基类类型 而不是派生类类型 include