关于继承~

继承

动物有猫、狗,   猫又分为加菲猫、布偶猫......;狗又有哈士奇、德国牧羊犬......

我们发现,下一类除了拥有上一类的共性之外,还拥有自己的特性。

于是我们可以利用继承的方式来减少重复的代码

继承的基本语法

class A:public B

A称为子类 或 派生类

B称为父类 或 基类

子类中的成员主要分为两大类

一类是从父类中继承过来的,我们叫做共性

一类是子类自己定义的,我们叫特性

继承的好处:减少重复的代码

//继承的基本语法
class BasePage {
public:
	void header() {
		cout << "首页、公开课、登录、注册...(公共头部)" << endl;
	}
	void footer() {
		cout << "帮助中心、联系方式、站内地图...(公共底部)" << endl;
	}
	void left() {
		cout << "Java、Python、C++...(公共列表)" << endl;
	}
};

class Java :public BasePage
{
public:
	void content() {
		cout << "Java学科视频" << endl;
	}
};
class Python :public BasePage
{
public:
	void content() {
		cout << "Python学科视频" << endl;
	}
};
class CPP :public BasePage
{
public:
	void content() {
		cout << "CPP学科视频" << endl;
	}
};
void test01() {
	Java ja;
	ja.header();
	ja.footer();
	ja.left();
	ja.content();
	cout << "------------" << endl;
	Python py;
	py.header();
	py.footer();
	py.left();
	py.content();
	cout << "------------" << endl;
	CPP cpp;
	cpp.header();
	cpp.footer();
	cpp.left();
	cpp.content();
	cout << "------------" << endl;
}
int main()
{
	test01();
}

继承方式

继承语法:class 子类:继承方式 父类

继承方式分为三种:公共继承、保护继承、私有继承

公共继承:公共成员、保护成员位置不变,私有成员不可访问

保护继承:公共成员、保护成员位于保护位置,私有成员不可访问

私有继承:公共成员、保护成员、私有成员都不可访问

注意:虽然不可访问,但是子类中确实继承了这些成员,只是被隐藏了,子类的子类也会继承这些属性。

继承中的对象模型

先敲一段代码

//继承中的对象模型
class Base {
public:
	int m_a;
protected:
	int m_b;
private:
	int m_c;
};
class Son :public Base {
public:
	int m_d;
};
int main()
{
	Son s1;
	cout << "size of Son=" << sizeof(s1);
}

利用sizeof计算类的长度,可以验证上一点讲的私有成员或私有继承不可访问但确实存在于子类中

下面再利用开发人员命令提示符用模型观察 

 

继承中构造和析构顺序

利用上面的模型也可以说明继承中 父类先构造、子类后构造(先有父亲再有儿子)

然后依据先进后出的原理,子类先析构、父类后析构

继承同名成员处理方式

//继承同名成员(非静态)的调用方式
class Base {
public:
	int m_a = 10;
	void fun() {
		cout << "父类的func" << endl;
	}
	void fun(int a) {
		cout << "父类的func 含参" << endl;
	}
};
class Son :public Base {
public:
	int m_a = 100;
	void fun() {
		cout << "子类的func" << endl;
	}
};
void test01() {
	Son s1;
	cout << s1.m_a << endl;//子类对象直接调用的是子类成员
	cout << s1.Base::m_a << endl;//子类对象加上父类作用域运算符调用的是父类成员
	s1.fun();
	s1.Base::fun();
	//s1.fun(100);报错,因为子类、父类函数同名情况下,子类会隐藏父类的所有同名成员函数,
	//要访问则加上作用域运算符
	s1.Base::fun(1000);
}
int main()
{
	test01();
}

总结:1、子类对象直接访问的是子类同名成员

           2、子类对象加上作用域可以访问父类同名成员

           3、子类和父类成员函数同名情况下,子类会隐藏父类中同名函数,子类对象加上作用域运算符可以访问父类同名函数 

继承同名静态成员处理方式

//继承中同名的静态成员
class Base {
public:
	void func() {
		cout << "diao1" << endl;
	}
	static  int a;
};
int Base::a = 8;//要加上作用域
class Son :public Base {
public:
	void func() {
		cout << "diao2" << endl;
	}
	static int a;
};
int Son::a = 9;
int main()
{
	Son s1;
	s1.func();
	s1.Base::func();
	cout << s1.a << endl;
	cout << s1.Base::a << endl;
	cout << Son::a << endl;
	cout << Son::Base::a << endl;
	//总结:对于类的非静态成员 通过对象访问
	//对于静态成员 1.通过对象访问
		//		  2.通过类名访问
}

多继承语法

class Base1 {
public:
	Base1(){
		m_A = 10;
	}
	int m_A;
};
class Base2 {
public:
	Base2() {
		m_A = 100;
	}
	int m_A;
};
class Son :public Base1, public Base2 //实际开发不建议使用多继承,多个程序员设置相同成员,影响使用
{
 };
void test01() {
	Son s1;
	//s1.m_A;父类成员同名,加作用域以区分
	cout << "Base1中m_A=" << s1.Base1::m_A << endl;
	cout << "Base2中m_A=" << s1.Base2::m_A << endl;
}
int main()
{
	test01();
}

菱形继承

//菱形继承
class Animal { public:int m_Age; };
class Sheep :virtual public Animal {};//继承前加virtual关键字,变为虚继承,继承的父类被称为虚基类
class Tuo:virtual public Animal {};//实际上是改为传递两个指针,指针都指向m_Age
class SheepTuo: public Sheep, public Tuo{};
void test01() {
	SheepTuo yt;
	yt.Sheep::m_Age = 19;
	yt.Tuo::m_Age = 29;
	yt.m_Age = 39;//若没有virtual,则此操作报错
	cout << "yt.Sheep::m_Age =" << yt.Sheep::m_Age << endl;
	cout << "yt.Tuo::m_Age =" << yt.Tuo::m_Age << endl;
	cout << "yt.m_Age =" << yt.m_Age << endl;
}
int main()
{
	test01();
}

菱形继承为子类继承父类中两份相同的数据,造成资源浪费和无意义

利用虚继承可以解决,虚继承后变为同一份数据 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/592013.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

二叉树的直径

题目描述&#xff1a;给你一棵二叉树的根节点&#xff0c;返回该树的 直径 。二叉树的 直径 是指树中任意两个节点之间最长路径的 长度 。这条路径可能经过也可能不经过根节点 root 。两节点之间路径的 长度 由它们之间边数表示。 示例 1&#xff1a; 输入&#xff1a;root […

在剪映专业版中新增字体的方法

我一开始以为剪映专业版没有繁体字&#xff0c;结果发现有一个现代繁体&#xff0c;如图所示: 但是我已经下载了字体了&#xff0c;不用就可惜了。 点击汉仪粗黑繁&#xff0c;安装。 安装之后&#xff0c;重启电脑&#xff0c;打开剪映&#xff0c;就可以搜索到这个字体了。 这…

每日OJ题_贪心算法二④_力扣2418. 按身高排序

目录 力扣2418. 按身高排序 解析代码 力扣2418. 按身高排序 2418. 按身高排序 难度 简单 给你一个字符串数组 names &#xff0c;和一个由 互不相同 的正整数组成的数组 heights 。两个数组的长度均为 n 。 对于每个下标 i&#xff0c;names[i] 和 heights[i] 表示第 i 个…

罗宾斯《管理学》第13版/教材讲解/考研真题视频课程/网课

本课程是罗宾斯《管理学》&#xff08;第13版&#xff09;精讲班&#xff0c;为了帮助参加研究生招生考试指定考研参考书目为罗宾斯《管理学》&#xff08;第13版&#xff09;的考生复习专业课&#xff0c;我们根据教材和名校考研真题的命题规律精心讲解教材章节内容。 序号名…

读天才与算法:人脑与AI的数学思维笔记17_歌曲的创作公式

1. 人为何创作音乐 1.1. 音乐一直具有算法性质&#xff0c;这意味着在所有的艺术形式中&#xff0c;它受到人工智能进步的威胁最大 1.1.1. 音乐也是所有艺术形式中最抽象的一种&#xff0c;它利用结构和模式&#xff0c;而正是这种抽象的性质使它与数学紧密相连 1.1.2. 在这…

查找算法之二分查找

一、算法介绍 二分查找&#xff0c;也称为折半查找&#xff0c;是一种在有序数组中查找特定元素的高效算法。对于包含 n 个元素的有序数组&#xff0c;二分查找的步骤如下&#xff1a; 确定搜索范围&#xff1a;首先&#xff0c;将要查找的元素与数组中间的元素进行比较。如果…

【C++】学习笔记——string_5

文章目录 六、string类7. string类的模拟实现8. string类的模拟实现的完整代码string.h头文件test.c源文件 9. string收尾写时拷贝 未完待续 六、string类 7. string类的模拟实现 我们之前讲了实现 insert &#xff0c;但是那个插入函数仅仅是在 pos 位置插入一个字符而且&am…

13.1 QQ邮箱

1. 邮箱发送 2. 准备工作 3. 整合SpringBoot 3.1 配置 依赖引入 <!-- 邮件服务--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-mail</artifactId></dependency>application.…

发表博客之:transformer 架构 推理时候运算流程详细讲解,以及变长推理支持,小白都可以看得懂,AI推理工程师必备技能!

文章目录 [发表博客之&#xff1a;transformer 架构 推理时候运算流程详细讲解&#xff0c;以及变长推理支持&#xff0c;小白都可以看得懂&#xff0c;AI推理工程师必备技能&#xff01;](https://cyj666.blog.csdn.net/article/details/138439826)总结一下高性能变长推理 发表…

DevicData-P-XXXXXX勒索病毒有什么特点,如何恢复重要数据?

DevicData-P-XXXXXXXX这种新型勒索病毒有什么特点&#xff1f; DevicData-P-XXXXXXXX勒索病毒的特点主要包括以下几点&#xff1a; 文件加密&#xff1a;该病毒会搜索并加密用户计算机上的重要文件&#xff0c;如文档、图片、视频等&#xff0c;使其无法正常打开。这是通过强…

IoTDB 入门教程 问题篇②——RPC远程连接IoTDB服务器失败

文章目录 一、前文二、发现问题三、分析问题四、检查6667端口是否监听所有IP五、检查ECS云服务器的安全组是否允许六、检查Linux防火墙是否允许 一、前文 IoTDB入门教程——导读 二、发现问题 使用本地IP127.0.0.1可以连接IoTDB服务器使用远程IPxx.xx.xx.xx却连接不到。提示你…

抖音小店怎么运营操作,无货源正确做店方式,新手就看这一篇

大家好&#xff0c;我是电商笨笨熊 当前抖店还能做无货源模式吗&#xff1f; 当然可以。 近两年由于平台对于无货源的打击&#xff0c;很多人开始怀疑&#xff0c;无货源模式在抖店还能行得通吗&#xff1f; 抖店这个项目我们做了四年多的时间&#xff0c;无货源模式也是&a…

双fifo流水线操作——verilog练习与设计

文章目录 一、案例分析二、fifo_ctrl模块设计2.1 波形设计&#xff1a;2.2 代码实现2.2.1 fifo_ctrl2.2.2 顶层文件top_fifo_ctrl&#xff08;rx和tx模块省略&#xff09;2.2.3 仿真文件tb_fifo_ctrl 2.3波形仿真 一、案例分析 案例要求&#xff1a;写一个 fifo 控制器&#x…

vivado Aurora 8B/10B IP核(12)- Setp By Step搭建FPGA工程

Step1:任意创建一个新的空的工程&#xff08;创建工程的具体工程如果还不清楚的看我们教程第一季部分&#xff09;&#xff0c; 并且进入IP CORE列表 右击Customize ip Step2:配置 IP CORE-Core options Step3:配置 IP CORE-GT Selections Step4:配置 IP CORE-Shared Logic 为 …

深入解析Python中的`add_argument`用法

深入解析Python中的add_argument用法 在Python编程中&#xff0c;add_argument通常与命令行参数解析库argparse有关。这个库主要用于编写用户友好的命令行接口&#xff0c;其核心功能之一就是通过add_argument方法来指定程序可以接受哪些命令行参数。本篇博客将详细介绍argpar…

badKarma:一款功能强大的网络侦查GUI工具

关于badKarma badKarma是一款开源的网络侦查工具&#xff0c;该工具基于Python 3开发&#xff0c;提供了友好的图形化用户接口&#xff0c;可以帮助广大渗透测试人员在网络基础设施安全审计过程中执行网络侦查任务。 badKarma是一个模块化工具&#xff0c;基于python3 GTK套件…

(centos)yum安装mysql8.4

1.MySQL官方已经提供了适用于不同Linux发行版的预构建软件包&#xff0c;包括适用于CentOS的Yum Repository MySQL :: MySQL Community Downloads 2.在/usr/local文件夹下创建mysql文件夹&#xff0c;将下载的rpm文件放到目录下 3.执行安装命令 yum install mysql-community-…

算法打卡day41

今日任务&#xff1a; 1&#xff09;198.打家劫舍 2&#xff09;213.打家劫舍II 3&#xff09;337.打家劫舍III 4&#xff09;复习day16 198.打家劫舍 题目链接&#xff1a;198. 打家劫舍 - 力扣&#xff08;LeetCode&#xff09; 你是一个专业的小偷&#xff0c;计划偷窃沿街…

网安笔记(纯兴趣,随缘更新)

对于千锋教育的网安课程的笔记 (一)虚拟机环境搭建 01虚拟机概述 传统运行模式:一台计算机同时只能运行一个操作系统 虚拟机运行架构: 1.寄生架构 &#xff08;实验环境、测试环境&#xff09; • 虚拟机作为应用软件安装在操作系统上 • 可以在此应用软件上安装多个操作系统…

Docker部署nginx并且实现https访问

实验环境&#xff1a; 在已有的docker环境和nginx镜像的基础上进行操作 1、生成私钥 &#xff08;1&#xff09;openssl genrsa -out key.pem 2048 生成证书签名请求 (CSR) 并自签证书: &#xff08;2&#xff09;openssl req -new -x509 -key key.pem -out cert.pem -day…