C++继承-基本语法--继承方式--继承同名成员处理方式--多继承语法--菱形继承

2023-10-27

1.基本语法
继承:减少重复代码
语法:class 子类:继承方式 父类
子类也叫派生类,父类也叫基类
派生类中的成员包括两大部分
一类是从基类继承过来的,一类是自己增加的成员。
从基类继承过来的表现其共性,而新增的成员体现了其个性。

#include<iostream>
#include<string>
using namespace std;
class BasePage {//基类
public:
	void header() {
		cout << "1" << endl;
	}
	void footer() {
		cout << "2" << endl;
	}
};
class Java :public BasePage {//派生类
public:
	void content() {
		cout << "Java学科视频" << endl;
	}
	
};
class Python :public BasePage {
public:
	void content() {
		cout << "Python学科视频" << endl;
	}
};
void test01() {
	Java  j;
	j.header();
	j.footer();
	j.content();
	Python p;
	p.content();
	p.footer();
	p.header();

	
		
}
int main() {
	test01();
	return 0;
}



2.继承方式
父类中私有的内容子类不管是哪种继承方式子类都不能访问,
公共继承:父类的公共和保护在子类中依然是相应的公共和保护,
保护继承:父类中除私有继承之外的在子类中全部变成保护权限
私有继承:父类中的所有内容(除私有的)在子类中全部变成私有权限
在这里插入图片描述
在这里插入图片描述
3.继承中的对象模型
首先来了解一下派生类里有什么
父类中所有非静态成员属性都会被子类继承下去
父类中的私有属性是被编译器给隐藏了,因此是访问不到,但是确实被继承下去了。

#include<iostream>
#include<string>
using namespace std;
class Base1{
public:
	int m_a;
protected:
	int m_b;
private:
	int m_c;
};
class Son1 :public Base1 {
public:
	int m_d;
	
};

void test01() {
	cout << "size of son=" << sizeof(Son1) << endl;		
}
int main() {
	test01();
	return 0;
}

可以利用开发人员命令提示符查看对象模型
先跳转文件所在盘D:
跳转文件路径 cd 粘贴具体路径
查看命名 dir
//cl /d1 reportSingleClassLayout类名 文件名
在这里插入图片描述
在这里插入图片描述
文件名可以用Tab键补全
4.继承中构造和析构的顺序
子类继承父类后,当创建子类对象,也会调用父类的构造函数
问题: 父类和子类的构造和析构顺序谁先谁后

#include<iostream>
#include<string>
using namespace std;
class Base{
public:
	Base() {
		cout << "父类的构造函数" << endl;
	}
	~Base() {
		cout << "父类的析构函数" << endl;
	}
};
class Son :public Base {
public:
	Son() {
		cout << "子类的构造函数" << endl;
	}
	~Son() {
		cout << "子类的析构函数" << endl;
	}
};

void test01() {
	Son s;
}
int main() {
	test01();
	return 0;
}



在这里插入图片描述
5.继承同名成员处理方式
当子类与父类出现同名成员时,如何通过子类对象,访问到子类或父类中同名的数据:
访问子类同名成员,直接访问即可。
访问父类同名成员,需要加作用域。

#include<iostream>
#include<string>
using namespace std;
class Base{
public:
	Base() {
	 m_a = 100;
	}
	int m_a;
};
class Son :public Base {
public:
	Son() {
		m_a = 200;
	}
	int m_a;
};
void test01() {
	Son s;
	//访问子类同名成员,直接访问即可
	cout << s.m_a << endl;
	//如果通过子类访问父类的同名成员,需要加一个作用域
	cout << s.Base::m_a << endl;
}
int main() {
	test01();
	return 0;
}

在这里插入图片描述
同名成员函数也是这样
如果子类中出现和父类同名的成员函数,子类中的同名成员会隐藏掉父类中所有的同名函数(包括重载的那点(比如多一个形参)),如果想访问到父类中被隐藏的同名函数,加作用域。

6.继承同名静态成员处理方式
继承中同名的静态成员在子类对象上如何进行访问?
静态成员和非静态成员出现同名,处理方式一致。
访问子类同名成员,直接访问
访问父类同名成员,加作用域

#include<iostream>
#include<string>
using namespace std;
class Base{
public:
	Base() {

	}
	static int m_a;
};
int Base::m_a = 100;
class Son :public Base {
public:
	Son() {
		
	}
	static int m_a;
};
int Son::m_a = 200;
void test01() {
	Son s;
	//访问子类同名成员,直接访问即可
	cout << s.m_a << endl;
	//如果通过子类访问父类的同名成员,需要加一个作用域
	cout << s.Base::m_a << endl;
}
int main() {
	test01();
	return 0;
}



在这里插入图片描述
注意这个赋值是在类外赋值,没有在构造函数里赋值,如果在构造函数里赋值会报错。

ps:静态成员访问方式有两种

第一种是通过对象来访问
第二种是通过类名来访问

	cout << Son::m_a << endl;
	//第一个::通过类名方式访问第二个::代表父类作用域下
	cout << Son::Base::m_a << endl;

静态同名成员函数和成员变量一样

7.多继承语法
C++允许一个类继承多个类
语法 class 子类:继承方式 父类1,继承方式 父类2…
多继承会引起重名,如果出现了同名的情况,子类使用的时候要加作用域

class Son :public Base1,public Base2 

8.菱形继承
在这里插入图片描述
典型的菱形继承案例
在这里插入图片描述
菱形继承问题:
在这里插入图片描述
在这里插入图片描述
二义性可以用表明作用域解决

#include<iostream>
#include<string>
using namespace std;
//动物类
class Animal{
//如果不写public,那么成员变量会默认为私有属性
public:
	int m_Age;
};
//羊类
class Sheep:virtual public Animal {
public:
	
};
//驼类
class Tuo :virtual public Animal {
public:
	
};
class yangtuo:public Sheep,public Tuo{};

void test01() {
	yangtuo yt;
	yt.Sheep::m_Age=3;
	yt.Tuo::m_Age = 5;
	}
int main() {
	test01();
	return 0;
}

年龄这份数据我们知道只有一份就可以,但这个有两个该怎么处理
//利用虚继承解决菱形继承的问题
//继承之前加上关键字 virtual 变为虚继承
//Animal 类称为虚基类
//羊类
class Sheep :virtual public Animal{}

#include<iostream>
#include<string>
using namespace std;
//动物类
class Animal{
//如果不写public,那么成员变量会默认为私有属性
public:
	int m_Age;
};
//羊类
class Sheep:virtual public Animal {
public:
	
};
//驼类
class Tuo :virtual public Animal {
public:
	
};
class yangtuo:public Sheep,public Tuo{};

void test01() {
	yangtuo yt;
	yt.Sheep::m_Age=3;
	yt.Tuo::m_Age = 5;
	cout << yt.m_Age << endl;
	//当出现菱形继承的时候,有两个父类具有相同的数据需要加作用域区分
}
int main() {
	test01();
	return 0;
}



在这里插入图片描述
写上了虚基类之后年龄就只有一个了
在这里插入图片描述
vbptr 虚基类指针,继承继承的是两个指针

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

C++继承-基本语法--继承方式--继承同名成员处理方式--多继承语法--菱形继承 的相关文章

  • 【干货】日志管理与分析(一)——日志收集及来源

    对广大IT工作者 尤其是运维和安全人员来说 日志 是一个再熟悉不过的名词 日志从哪来 机房中的各种软件 系统 防火墙 和硬件 交换机 路由器等 都在不断地生成日志 IT安全业界的无数实践告诉我们 健全的日志记录和分析系统 是系统正常运营 优
  • [C++]抽象工厂模式

    抽象工厂模式 Abstract Factory Pattern 是围绕一个超级工厂创建其他工厂 该超级工厂又称为其他工厂的工厂 这种类型的设计模式属于创建型模式 它提供了一种创建对象的最佳方式 在抽象工厂模式中 接口是负责创建一个相关对象的
  • KETTLE WEB管理控制台设计

    KETTLE WEB管理控制台设计 系统效果图 1 资源配置管理 1 1 用例图 1 2 用例叙述 1 2 1 添加资源库用例 用例名称 添加资源库 前置条件 操作员在启动这个用例之前 必须先执行过 登录 用例 主要事件流 1 当用户选择添
  • 清除input的缓存

    有过表单设计经验的朋友肯定知道 当我们在浏览器中输入表单信息的时候 往往input文本输入框会记录下之前提交表单的信息 以后每次只要双击 input文本输入框就会出现之前输入的文本 这样有时会觉得比较方便 但有时也会暴露用户的隐藏数据 那么
  • oracle简单的备份

    企业之中这种备份肯定用不到 只是闲着没事简单备份一下自己的数据库 方便以后调数据 查阅 一 备份 1 打开cmd 切到oracle的bin目录 2 备份 exp scott 123456 file E oracle备份 scott back
  • CUDA优化:最大化内存吞吐量(官方文档翻译)

    毕业设计要翻译技术资料 3000 字 这里找了英伟达 CUDA TOOLKIT DOCUMENTATION 的 5 3 节 最大化内存吞吐量来 翻译一下 供参考 并希望此文对诸位的 CUDA 程序优化有所帮助 5 3 最大化内存吞吐量 最大
  • 【JPCS 独立出版】2022年机器人与人工智能国际会议(JCRAI 2022)

    2022年机器人与人工智能国际会议 JCRAI 2022 重要信息 会议网址 www jcrai org 会议时间 2022年10月14 16日 召开地点 中国成都 截稿时间 2022年8月30日 录用通知 投稿后2周内 出版社 Journ
  • 【论文&模型讲解】VideoBERT: A Joint Model for Video and Language Representation Learning

    文章目录 前言 0 摘要 1 Introduction 2 相关工作 3 模型 3 1 BERT 3 2 VideoBERT 4 实验与分析 4 1 数据集 4 2 视频和语言预处理 4 3 模型预训练 4 4 zero shot 动作分类
  • Windows与WSL子系统Docker和NVIDIA安装注意事项

    Windows与WSL子系统Docker和NVIDIA安装注意事项 WSL子系统NVIDIA驱动安装的注意事项 确保在windows上安装了CUDA11 8 一定确保CUDA确实安装 一定需要在WSL子系统再重新安装CUDA11 8 设置一
  • windows配置组策略所有题目

    sa禁用cmd 用户配置 策略 管理模板 系统 阻止访问命令提示符 sa隐藏c盘 用户配置 策略 管理员模板 windows组件 文件资源管理器 隐藏我的电脑中的这些指定的驱动 sa组桌面环境 用户配置 管理员模板 桌面 退出时不保存设置
  • python复习之零碎知识点

    马上就要考试了 相信大家在大的知识块上已经都复习的差不多了 今天带大家一起看一看较为细节的一些知识点吧 abs 用来计算复数的模长 python不支持字符与数字相加 gt gt gt a 1 Traceback most recent ca
  • tensorflow1.14.0安装教程--保姆级

    方法不止一种 下面仅展示一种 注 本人电脑为win11 anaconda的python版本为3 9 但tensorflow需要python版本为3 7 所以下面主要阐述将python版本改为3 7后的安装过程以及常遇到的问题 1 首先电脑安
  • GIT 撤销与回滚

    git 相信大家都会用 但是大家有没有遇到过 不小心把不该提交的文件 commit 了 小编整理了一些我在开发中常见的使用场景 供大家参考 场景一 糟了 我刚把不想要的代码 commit到本地仓库中了 但是还没有做push操作 这种场景称为
  • Java什么是对象?

    真实世界对象具有共同的两个特性 它们都有状态和行为 狗有状态 名字 颜色 品种 饥饿 和行为 叫 刨地 摇尾巴 自行车也有状态 当前的齿轮档位 当前的脚踏板频率 当前的速度 和行为 变速 变脚踏板速率 刹车 识别真实世界对象的状态和行为是开
  • ECLIPSE java类文件从实心变为空心,以及右键项目没有 build path,或build path显示 no available source的问题

    导入别人的项目 一开始问题是Java类文件的图标由实心变成了空心 这样的话类文件不能编译 main方法也不能执行 查了半天都说要重新配置 build path 可是我右键项目名根本就没有build path 然后有人说把右上角 javaEE

随机推荐

  • mysql 建表时at line 1_数据库学习笔记之MySQL(11)

    目录 01 三表复合查询 02 对比外键约束的作用 03 添加外键 建表时添加 正文 01 三表复合查询从性能角度讲 多表联合查询没有从单表查询后合并性能高 SELECT a id a name b tel c emailFROM tbl
  • ChatGLM-6B之SSE通信(Server-sent Events)

    目录 研究历程 只是感受 不感兴趣的这段可以跳过 直接看下边的正题 找 正题 二字 正题 1 SSE Server sent Events 2 ChatGLM的流式方法 3 ChatGLM之SSE通信 写这篇博客还是很激动开心的 因为是我经
  • 错误解决——搭建悟空crm9项目运行环境过程中遇到的一些问题和错误解决办法

    错误解决 搭建悟空crm9项目运行环境过程中遇到的一些问题和错误解决办法 一 安装jdk 二 安装Tomcat 问题 1 三 安装MySQL 四 安装Redis 问题 1 问题 2 问题 3 五 安装悟空crm9 问题 1 问题 2 问题
  • C# 静态类和sealed类(密封类)的区别

    网上看到很多文章写静态类 和密封类 但是鲜有它们的对比总结 在此简单总结一下 静态类 Static Class 静态类不能被实例化 其成员都是静态的 可以通过类名直接访问 静态类通常用于创建一组相关的静态方法和属性 提供一些全局功能或工具函
  • Golang爬虫终极杀器——Chromedp让你成为二维码登陆终结者(教程)

    Golang爬虫终极杀器 Chromedp让你成为二维码登陆终结者 教程 Github源码 chromedp 文章项目Gitee源码 1 Chromedp是什么 chromedp是一个更快 更简单的Golang库用于调用支持Chrome D
  • 二哈智能图像识别使用I2C导出识别结果到Wemos D1板

    学校比赛 购买了一块智能识别传感器模块huskylens 商家给了使用文档 但是别人用的官方uno板子来连接 我手里面只有ESP8266WiFi板子 只能把I2C驱动程序编译到esp8266上了 这是我的板子 说明文档里面只给了连接UNO
  • LZW编解码算法实现及编码效率分析

    一 编码原理 第二类算法的想法是企图从输入的数据中创建一个 短语词典 dictionary of the phrases 这种短语可以是任意字符的组合 编码数据过程中当遇到已经在词典中出现的 短语 时 编码器就输出这个词典中的短语的 索引号
  • 美国的有线电视节目提供商

    HBO HBO电视网 英文名 Home Box Office 是总部位于美国纽约的有线电视网络媒体公司 HBO电视网于1972年开播 全天候播出电影 音乐 纪录片 体育赛事等娱乐节目 与绝大多数电视频道不同的是 它不卖广告 经过22年的发展
  • 什么是正则表达式?

    什么是正则表达式 1 什么是正则表达式 2 基本匹配 3 元字符 1 什么是正则表达式 正则表达式是 组由字 和符号组成的特殊 本 它可以 来从 本中找出满 你想要的格式的句 个正则表达式是 种从左到右匹配主体字符串的模式 Regular
  • Vue 中给数组增加自定义方法

    第一步 在程序根目录下创建 src common functions myFunction js 文件 第二步 文件内写入 export default install Vue 返回val在当前列表内的位置 Array prototype
  • SimpleServletHandlerAdapter类简介说明

    转自 SimpleServletHandlerAdapter类简介说明 下文笔者讲述SimpleServletHandlerAdapter类简介说明 如下所示 SimpleServletHandlerAdapter简介 SimpleServ
  • pycharm配置python环境变量详细步骤

    1 打开pycharm 点file settings 2 点击profect下的Python Interpeter
  • 目标检测与识别算法研究

    一 目标检测与识别 目标检测与识别是很多计算机视觉任务的基础 通俗地讲 其目的是在目标场景中将目标用一个个框框出来 并且识别出这个框中的物体 即包括加测 where 和识别 what 两个过程 1 技术难点 目标检测与识别任务对于人类来说
  • linux c语言字符串函数replace,indexOf,substring等的实现

    c语言没有像java那么丰富的字符串操作函数 很多有用的函数得自己写 搞了一天 写了几个常用函数 留着以后有用 include
  • Spark大数据分析与实战笔记(第一章 Scala语言基础-1)

    文章目录 章节概要 1 1 初识Scala 1 1 1 Scala的概述 1 1 2 Scala的下载安装 1 1 3 在IDEA开发工具中下载安装Scala插件 1 1 4 开发第一个Scala程序 章节概要 Spark是专为大规模数据处
  • python高级变量类型

    列表概念及操作 1 列表的定义 列表格式 列表名 元素1 元素2 例 my list 1 2 3 True 空列表的定义 my list 或 my list list 2 列表的循环遍历 for 循环遍历 while循环遍历 3 列表的常见
  • 利用Keras实现FGSM算法

    最近项目中需要使用FGSM攻击方法 使用主流的foolbox和cleverhans中的攻击方法时 发现模型不匹配 所以不能继续使用 网上找到的代码也不能使用 需要自己实现一个 根据论文 Explaining and Harnessing A
  • [ACTF新生赛2020]easyre 1

    查壳 是32位 upx壳 脱壳就是找的脱壳软件 我也不是很懂 就说下我的具体操作步骤吧 打开cmd 脱upx壳的软件拖进去 空格 d 空格 有壳文件拖入 解出来了 下面看代码吧 然后就挺简单的 就这点代码 下面那个for循环逆着写就行了 注
  • 欧科云链:2023年5月链上安全事件盘点

    一 基本信息 2023年5月安全事件约造成1800万美元损失 相比上月有显著下降 但安全事件发生频率并未减少 其中针对Jimbos Protocol的攻击造成了约750万美元损失 Arbitrum链的Swaprum项目Rug Pull造成了
  • C++继承-基本语法--继承方式--继承同名成员处理方式--多继承语法--菱形继承

    1 基本语法 继承 减少重复代码 语法 class 子类 继承方式 父类 子类也叫派生类 父类也叫基类 派生类中的成员包括两大部分 一类是从基类继承过来的 一类是自己增加的成员 从基类继承过来的表现其共性 而新增的成员体现了其个性 incl