继承(个人学习笔记黑马学习)

1、基本语法

#include <iostream>
using namespace std;
#include <string>//普通实现页面//Java页面
//class Java {
//public:
//	void header() {
//		cout << "首页、公开课、登录、注册...(公共头部)" << endl;
//	}
//	void footer() {
//		cout << "帮助中心、交流合作、站内地图...(公共底部)" << endl;
//	}
//	void left() {
//		cout << "Java、python、c++...(公共分类列表)" << endl;
//	}
//	void content() {
//		cout << "Java学科视频" << endl;
//	}
//};
//
//
Python页面
//class Python {
//public:
//	void header() {
//		cout << "首页、公开课、登录、注册...(公共头部)" << endl;
//	}
//	void footer() {
//		cout << "帮助中心、交流合作、站内地图...(公共底部)" << endl;
//	}
//	void left() {
//		cout << "Java、python、c++...(公共分类列表)" << endl;
//	}
//	void content() {
//		cout << "Python学科视频" << endl;
//	}
//}; 
//
C++页面
//class CPP {
//public:
//	void header() {
//		cout << "首页、公开课、登录、注册...(公共头部)" << endl;
//	}
//	void footer() {
//		cout << "帮助中心、交流合作、站内地图...(公共底部)" << endl;
//	}
//	void left() {
//		cout << "Java、python、c++...(公共分类列表)" << endl;
//	}
//	void content() {
//		cout << "C++学科视频" << endl;
//	}
//};//继承实现页面//公共页面
class BasePage {
public:void header() {cout << "首页、公开课、登录、注册...(公共头部)" << endl;}void footer() {cout << "帮助中心、交流合作、站内地图...(公共底部)" << endl;}void left() {cout << "Java、python、c++...(公共分类列表)" << endl;}
};//Java页面
class Java :public BasePage {
public:void content() {cout << "Java学科视频" << endl;}
};//Python页面
class Python :public BasePage {
public:void content() {cout << "Python学科视频" << endl;}
};//C++页面
class CPP :public BasePage {
public:void content() {cout << "C++学科视频" << endl;}
};void test01() {cout << "Java下载视频页面如下:" << endl;Java ja;ja.header();ja.footer();ja.left();ja.content();cout << "---------------------------" << endl;cout << "Python下载视频页面如下:" << endl;Python py;py.header();py.footer();py.left();py.content();cout << "---------------------------" << endl;cout << "C++下载视频页面如下:" << endl;CPP cpp;cpp.header();cpp.footer();cpp.left();cpp.content();
}int main() {test01();system("pause");return 0;
}


2、继承方式

继承方式一共有三种:

  • 公共继承
  • 保护继承
  • 私有继承
#include <iostream>
using namespace std;
#include <string>//公共继承
class Base1 {
public:int m_A;
protected:int m_B;
private:int m_C;
};class Son1 :public Base1 {void func() {m_A = 10;//父类中的公共权限成员 到子类中依然是公共权限m_B = 10;//父类中的保护权限成员 到子类中依然是保护权限//m_C = 10;//父类中的私有权限成员 子类访问不到}
};
void test01() {Son1 s1;s1.m_A = 100;//s1.m_B = 100;//到son1中 m_B是保护权限 类外访问不到
}//保护继承
class Base2 {
public:int m_A;
protected:int m_B;
private:int m_C;
};class Son2 :protected Base2 {
public:void func() {m_A = 10;//父类中的公共权限成员 到子类中是保护权限m_B = 10;//父类中的保护权限成员 到子类中依然是保护权限//m_C = 10;//父类中的私有权限成员 子类访问不到}
};void test02() {Son2 s1;//s1.m_A = 1000;//在son2中 m_A变为保护权限 因此类外访问不到//s1.m_B = 1000;//在son2中 m_B保护权限 不可以访问
}//私有继承
class Base3 {
public:int m_A;
protected:int m_B;
private:int m_C;
};
class Son3 :private Base2 {
public:void func() {m_A = 10;//父类中的公共权限成员 到子类中是私有权限m_B = 10;//父类中的保护权限成员 到子类中是私有权限//m_C = 10;//父类中的私有权限成员 子类访问不到}
};class GrandSon3 :public Son3 {
public:void func() {//m_A = 1000;//到了son3中 m_A变为私有 即使是儿子 也访问不到//m_B = 1000;//到了son3中 m_B变为私有 即使是儿子 也访问不到}
};void test03() {Son3 s1;//s1.m_A = 1000;//在son3中 m_A变为私有权限 因此类外访问不到//s1.m_B = 1000;//在son3中 m_B私有权限 不可以访问
}int main() {system("pause");return 0;
}

3、继承中的对象模型

#include <iostream>
using namespace std;
#include <string>class Base {
public:int m_A;
protected:int m_B;
private:int m_C;
};class Son :public Base {
public:int m_D;};//利用开发人员命令提示符工具查看对象模型
//跳转盘符 F:
//跳转文件路径 cd 具体路径下
//查看命令
// cl /d1 reportSingleClassLayout类名 文件名void test01() {//16//父类中所有非静态成员属性都会被子类继承下去//父类中私有成员属性 是被编译器给隐藏了 因此是访问不到,但是缺省被继承下去了cout << "size of Son = " << sizeof(Son) << endl;
}int main() {system("pause");return 0;
}

4、继承中构造和析构顺序

#include <iostream>
using namespace std;
#include <string>//继承中的构造和析构顺序
class Base {
public:Base() {cout << "Base的构造函数" << endl;}~Base() {cout << "Base的析构函数" << endl;}
};
class Son :public Base {
public:Son() {cout << "Son的构造函数" << endl;}~Son() {cout << "Son的析构函数" << endl;}
};void test01() {//继承的构造和析构顺序如下://先构造父类 再构造子类,析构的顺序与构造的顺序相反Son s;
}int main() {test01();system("pause");return 0;
}

5、同名成员处理

#include <iostream>
using namespace std;
#include <string>class Base {
public:Base() {m_A = 100;}void func() {cout << "Base - func()调用" << endl;}void func(int a) {cout << "Base - func(int a)调用" << endl;}int m_A;
};
class Son :public Base {
public:Son() {m_A = 200;}void func() {cout << "Son - func()调用" << endl;}int m_A;
};//同名成员属性
void test01() {Son s;cout << "Son 下m_A = " << s.m_A << endl;//如果通过子类对象 访问到父类中同名成员 需要加作用域cout << "Base 下m_A = " << s.Base::m_A << endl;}//同名成员函数处理
void test02() {Son s;s.func();//直接调用 调用是子类中的同名成员s.Base::func();//调用父类的//如果子类中出现和父类同名的成员函数,子类的同名成员会隐藏掉父类中所有同名的成员函数//如果想访问到父类中被隐藏的同名成员函数,需要加作用域//s.func(100); 错误s.Base::func(100);
}int main() {//test01();test02();system("pause");return 0;
}

6、同名静态成员处理方法

#include <iostream>
using namespace std;
#include <string>class Base {
public:static int m_A;static void func() {cout << "Base - static void func()" << endl;}
};
int Base::m_A=100;class Son :public Base {
public:static int m_A;static void func() {cout << "Son - static void func()" << endl;}
};
int Son::m_A = 200;//同名静态成员属性
void test01() {//1、通过对象访问cout << "通过对象访问:" << endl;Son s;cout << " Son 下m_A = " << s.m_A << endl;cout << "Base 下m_A = " << s.Base::m_A << endl;//2、通过类名访问cout << "通过类名访问:" << endl;cout << "Son 下m_A = " << Son::m_A << endl;//第一个:代表通过类名方式访问 第二个:代表访问父类作用域下cout << "Base 下m_A = " << Son::Base::m_A << endl;}
//同名静态成员函数
void test02() {//1、通过对象访问cout << "通过对象访问:" << endl;Son s;s.func();s.Base::func();//2、通过类名访问cout << "通过类名访问:" << endl;Son::func();Son::Base::func();
}int main() {//test01();test02();system("pause");return 0;
}

7、多继承语法

#include <iostream>
using namespace std;
#include <string>class Base1 {
public:Base1() {m_A = 100;}int m_A;
};class Base2{
public:Base2() {m_A = 200;}int m_A;
};//子类 需要继承Base1 和Base2
class Son :public Base1, public Base2 {
public:Son() {m_C = 300;m_D = 400;}int m_C;int m_D;
};void test01() {Son s;cout << "sizeof Son = " << sizeof(s) << endl;//当父类中出现同名成员,需要加作用域区分cout << "Base1::m_A = " << s.Base1::m_A << endl;cout << "Base2::m_A = " << s.Base2::m_A << endl;
}int main() {test01();system("pause");return 0;
}

8、菱形继承

菱形继承概念
两个派生类继承同一个基类

又有某个类同时继承者两个派生类

这种继承被称为菱形继承,或者钻石继承

#include <iostream>
using namespace std;
#include <string>//动物类
class Animal {
public:int m_Age;
};//利用虚继承 解决菱形继承的问题
//继承之前 加上关键字 virtual 变为虚继承
// Animal类称为 虚基类
//羊类  
class Sheep :virtual public Animal {};//驼类
class Tuo :virtual public Animal {};//羊驼类
class SheepTuo :public Sheep, public Tuo {};void test01() {SheepTuo st;st.Sheep::m_Age = 18;st.Tuo::m_Age = 28;//当菱形继承,两个父类拥有相同数据,需要加以作用域区分cout << "st.Sheep::m_Age = " << st.Sheep::m_Age << endl;cout << "st.Tuo::m_Age =" << st.Tuo::m_Age << endl;cout << "st.m_Age = " << st.m_Age << endl;//这份数据我们知道 只要有一份就可以,菱形继承导致数据有两份,资源浪费}int main() {test01();system("pause");return 0;
}

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【广州华锐互动】VR全景工厂虚拟导览,虚拟现实技术提升企业数字化信息管理水平

随着工业4.0的到来&#xff0c;VR工厂全景制作成为了越来越多工业企业的选择。传统的工厂管理方式往往存在诸多问题&#xff0c;如信息不对称、安全隐患等。为了解决这些问题&#xff0c;VR工厂全景制作应运而生&#xff0c;它通过结合虚拟现实现实技术和数据采集技术&#xff…

设计模式-迭代器

文章目录 1. 引言1.1 概述1.2 设计模式1.3 迭代器模式的应用场景1.4 迭代器模式的作用 2. 基本概念2.1 迭代器 Iterator2.2 聚合 Aggregate2.3 具体聚合 ConcreteAggregate 3. Java 实现迭代器模式3.1 Java 集合框架3.2 Java 迭代器接口3.3 Java 迭代器模式实现示例 4. 迭代器模…

Android 音频框架 基于android 12

文章目录 前言音频服务audioserver音频数据链路hal 提供什么样的作用 前言 Android 的音频是一个相当复杂的部分。从应用到框架、hal、kernel、最后到硬件&#xff0c;每个部分的知识点都相当的多。而android 这部分代码在版本之间改动很大、其中充斥着各种workaround的处理&a…

介绍GitHub

GitHub 是一个基于互联网的源代码托管平台&#xff0c;可以帮助软件开发者存储和管理源代码&#xff0c;方便团队协作和版本控制。GitHub 的主要功能包括&#xff1a; 代码托管&#xff1a;开发者可以在 GitHub 上创建远程代码仓库&#xff0c;存储和管理他们的源代码。 版本控…

聚观早报|多邻国推出进阶英文课程;电动汽车成本将高于燃油车

【聚观365】9月5日消息 多邻国即将推出进阶英文课程 未来电动汽车成本仍将高于燃油车 戴尔科技2024财年第二季度营收229亿美元 现代汽车电动汽车销量在8月份环比继续下滑 马斯克称将用X数据训练AI 多邻国即将推出进阶英文课程 语言学习平台多邻国宣布&#xff0c;为了满…

TCP机制之连接管理(三次握手和四次挥手详解)

TCP的连接管理机制描述了连接如何创建以及如何断开! 建立连接(三次握手) 三次握手的过程 所谓建立连接就是通信双方各自要记录对方的信息,彼此之间要相互认同;这里以A B双方确立男女朋友关系为例: 从图中可以看出,通信双方各自向对方发起一个"建立连接"的请求,同时…

SOME/IP TTL 在各种Entry 中各是什么意思?有什么限制?

1 服务发现 SOME/IP SD 服务发现主要用于 定位服务实例检测服务实例状态是否在运行发布/订阅行为管理SOME/IP SD 也是 SOME/IP 消息,遵循 SOME/IP 消息格式,有固定的 Message ID、Request ID 以及 Message Type 等。并对 SOME/IP Payload 进行了详细的定义。 SOME/IP SD …

STM32CUBEMX_创建时间片轮询架构的软件框架

STM32CUBEMX_创建时间片轮询架构的软件框架 说明&#xff1a; 1、这种架构避免在更新STM32CUBEMX配置后把用户代码清除掉 2、利用这种时间片的架构可以使得代码架构清晰易于维护 创建步骤&#xff1a; 1、使用STM32CUBEMX创建基础工程 2、新建用户代码目录 3、构建基础的代码框…

Unity生命周期函数

1、Awake 当对象&#xff08;自己这个类对象&#xff0c;就是这个脚本&#xff09;被创建时 才会调用该生命周期函数 类似构造函数的存在 我们可以在一个类对象创建时进行一些初始化操作 2、OnEnable 失活激活&#xff08;这个勾&#xff09; 想要当一个对象&#xff08;游戏…

C语言基础知识理论版(很详细)

文章目录 前述一、数据1.1 数据类型1.2 数据第一种数据&#xff1a;常量第二种数据&#xff1a;变量第三种数据&#xff1a;表达式1、算术运算符及算术表达式2、赋值运算符及赋值表达式3、自增、自减运算符4、逗号运算符及其表达式&#xff08;‘顺序求值’表达式&#xff09;5…

光电耦合器市场在预测期内预计将以8.99%的复合年增长率增长!

光耦合器是一种用于传输光信号的电子器件。它具有以下特性&#xff1a; 1. 传输性能&#xff1a;光耦合器能够实现光电转化和信号传输&#xff0c;具有良好的传输性能和抗干扰能力&#xff0c;可以避免外部环境的干扰。 2. 隔离性能&#xff1a;光耦合器能够实现电路之间的隔…

学习MATLAB

今日&#xff0c;在大学慕课上找了一门关于MATLAB学习的网课&#xff0c;MATLAB对于我们这种自动化的学生应该是很重要的&#xff0c;之前也是在大三的寒假做自控的课程设计时候用到过&#xff0c;画一些奈奎斯特图&#xff0c;根轨迹图以及伯德图&#xff0c;但那之后也就没怎…

【构造】CF Edu 12 D

Problem - D - Codeforces 题意&#xff1a; 思路&#xff1a; 这种题一定要从小数据入手&#xff0c;不然很有可能走歪思路 先考虑n 1的情况&#xff0c;直接输出即可 然后是n 2的情况&#xff0c;如果相加是质数&#xff0c;就输出2个&#xff0c;否则就输出一个 然后…

死锁是什么?死锁的字节码指令了解?

用幽默浅显的言语来说死锁 半生&#xff1a;我已经拿到了机考的第一名&#xff0c;就差笔试第一名了 小一&#xff1a;我已经拿到了笔试的第一名&#xff0c;就差机考第一名了 面试官&#xff1a;我很看好你俩&#xff0c;继续"干", 同时拿到2个的第一名才能拿到offe…

算法训练 第一周

一、合并两个有序数组 本题给出了两个整数数组nums1和nums2&#xff0c;这两个数组均是非递减排列&#xff0c;要求我们将这两个数组合并成一个非递减排列的数组。题目中还要求我们把合并完的数组存储在nums1中&#xff0c;并且为了存储两个数组中全部的数据&#xff0c;nums1中…

签到系统怎么设计

背景 相信签到系统大家都有接触过&#xff0c;更多的是使用。但是有思考过这种系统是怎么设计的吗&#xff1f;比方说我统计一下每个月中每天的签到情况&#xff0c;怎么设计呢&#xff1f;今天一篇文章告诉你。 首先&#xff0c;我们熟悉的思维是&#xff1a;我设计一个数据…

[SSM]MyBatisPlus进阶

三、进阶篇 3.1映射 3.1.1自动映射规则 表名和实体类名映射 -> 表名user 实体类名User字段名和实体类属性名映射 -> 字段名name 实体类属性名name字段名下划线命名方式和实体类属性驼峰命名方式映射 -> 字段名 user_email 实体类属性名 userEmail 开启驼峰命名 m…

设计模式之适配器与装饰器

目录 适配器模式 简介 角色 使用 优缺点 使用场景 装饰器模式 简介 优缺点 模式结构 使用 使用场景 适配器模式 简介 允许将不兼容的对象包装成一个适配器类&#xff0c;使得其他类可以通过适配器类与原始对象进行交互&#xff0c;从而提高兼容性 角色 目标角色…

vite+vue3+element-plus

vitevue3element-plus 1.开始 npm create vitelatest app -- --template vuenpm installlnpm run dev2.引入element-ui npm install element-plus修改main.js import ElementPlus from element-plus import element-plus/dist/index.css createApp(App).use(ElementPlus).m…

BlueStore BlueFS rocksdb 关联性梳理

Tag: ceph 12.2.4 BlueStore空间初始化 BlueStore磁盘空间管理 总述 OSD挂载目录基于文件系统管理&#xff0c;Slow、WAL、DB空间区域基于裸盘管理&#xff1b;Slow区域&#xff1a;此类空间主要用于存储对象数据&#xff0c;由BlueStore管理&#xff0c;其中分配于BlueFS空…