继承(个人学习笔记黑马学习)
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; }
相关文章:

继承(个人学习笔记黑马学习)
1、基本语法 #include <iostream> using namespace std; #include <string>//普通实现页面//Java页面 //class Java { //public: // void header() { // cout << "首页、公开课、登录、注册...(公共头部)" << endl; // } // void footer() …...

ToBeWritten之ATTCK 测评方案
也许每个人出生的时候都以为这世界都是为他一个人而存在的,当他发现自己错的时候,他便开始长大 少走了弯路,也就错过了风景,无论如何,感谢经历 转移发布平台通知:将不再在CSDN博客发布新文章,敬…...

JSONUtil详解
JSONUtil是一个通用的JSON工具类,用于在Java中操作JSON数据。虽然之前提到的示例中没有直接提及JSONUtil,但可以解释一下可能存在的一些常见JSON操作方法,这些方法通常可以在不同的JSON工具类中找到。 JSONUtil中的一些常见方法包括…...

ArcGIS Maps SDK for JS(一):概述与使用
文章目录 1 概述2 如何使用ArcGIS Maps SDK for JavaScript2.1 AMD 模块与 ES 模块2.2 AMD 模块和 ES 模块比较 3 几种安装方式3.1 通过 ArcGIS CDN 获取 AMD 模块3.2 通过 NPM 运行 ES 模块3.3 通过 CDN 获取 ES 模块3.4 本地构建 ES3.5 本地构建 AMD 3 VSCode下载与安装2.1 下…...

【STM32】FSMC接口的复用和非复用
问题背景 在阅读《零死角玩转STM32—F103指南者》,以及《STM32F10x-中文参考手册》关于FSMC一章节的时候,对于在控制NOR/SRAM的时候使用到的引脚,在提到NOR器件的时候提到了地址复用和非复用接口,一时间没明白是什么东西。 结论 非复用模式…...

操作系统强化认识之Shell编程学习与总结
目录 1.Shell的概述 2.Shell脚本入门 3.变量 3.1.系统预定义变量 3.2.自定义变量 3.3.特殊变量 4.运算符 5.条件判断 6.流程控制 6.1.if判断 6.2.case语句 6.3.for循环 6.4.while循环 7.read读取控制台输入 8.函数 8.1.系统函数 8.2.自定义函数 9.正则表示式入…...

怎么用conda下载清华源的pytorch(自带cuda的版本)
1,添加镜像源 conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free conda config --add channels https://mirrors.tuna.tsinghua.edu.cn…...

【ES6】CommonJS模块和ES6模块
在JavaScript中,模块是一种将功能代码组织成逻辑单元的方式,以便在其他项目中重复使用。有两种主要的模块系统:CommonJS和ES6。 1、CommonJS 在CommonJS中,我们使用require来引入模块,使用module.exports来导出模块。…...

两个线程同步执行:解决乱箭穿心(STL/Windows/Linux)
C自学精简教程 目录(必读) C并发编程入门 目录 多线程同步 线程之间同步是指线程等待其他线程执行完某个动作之后再执行(本文情况)。 线程同步还可以是像十字路口的红绿灯一样,只允许一个方向的车同行,其他方向的车等待。 本…...

Ubuntu18.04更改镜像源(网易,阿里,清华,中科大,浙大)
一,备份原来的源(选做) sudo cp /etc/apt/sources.list /etc/apt/sources_init.list 二,更换源 sudo gedit /etc/apt/sources.list 删除原来内容改为新的镜像源 1,清华源 deb https://mirrors.tuna.tsinghua.edu…...

字节码和机器码的区别
字节码和机器码是计算机程序在不同阶段的表示形式,它们的主要区别如下: 抽象级别不同:字节码是一种中间表示形式,位于源代码和机器码之间。它是一种与特定平台无关的低级表示形式,通常由编译器将源代码转换而来。而机器…...

go学习part21 Redis和Go(2)
1.三方库安装 309_尚硅谷_Go连接到Redis_哔哩哔哩_bilibili 借鉴: Golang 安装 Redis_go fiber 安装redis_柒柒伍贰玖。的博客-CSDN博客 三方redis库已经迁移到以下网址,go get github.com/gomodule/redigo/redis gomodule/redigo: Go client for Red…...

从0到1学会Git(第二部分):Git的本地操作和管理
写在前面:本文介绍了在本地仓库进行文件的处理以及本地的合并等操作。 前置知识:文件可以处在三个区域,分别为工作区,暂存区和本地仓库,我们此文的目标即是将文件存储在本地仓库中。我们可以将文件的区域理解为,cpu中,…...

hive lateral view 实践记录(Array和Map数据类型)
目录 一、Array 1.建表并插入数据 2.lateral view explode 二、Map 1、建表并插入数据 2、lateral view explode() 3、查询数据 一、Array 1.建表并插入数据 正确插入数据: create table tmp.test_lateral_view_movie_230829(movie string,category array&…...

理解 std::thread::join
C多线程并发编程入门(目录) 本文用最简单易懂的实际案例,讲清楚了 join 的实际内涵,保证你过目不忘。 Hello join 示例 join 函数是我们接触C多线程 thread 遇到的第一个函数。 比如: int main() {thread t(f);t.…...

C#循环定时上传数据,失败重传解决方案,数据库标识
有些时候我们需要定时的上传一些数据库的数据,在数据不完整的情况下可能上传失败,上传失败后我们需要定时在重新上传失败的数据,该怎么合理的制定解决方案呢?下面一起看一下: 当然本篇文章只是提供一个思路࿰…...

R语言图形的组合( par(),layout(),par(fig()) )
引入d.class进行画图 > d.class<-read.csv("D://class.csv",header T) > attach(d.class) > opar<-par(no.readonly TRUE)非常简单的数据,需要可自取 链接:https://pan.baidu.com/s/1zNx5z9JsaaRqFueRgGY3mQ 提取码&#x…...

如何为 Flutter 应用程序创建环境变量
我们为什么需要环境变量? 主要用于存储高级机密数据,如果泄露可能会危及您产品的安全性。这些变量本地存储在每个用户的本地系统中,不应该签入存储库。每个用户都有这些变量的副本。 配置 在根项目中创建一个名为 .env 的文件夹(…...

「C++程序设计 (面向对象进阶)」学习笔记・一
0、引言 本专栏的系列文章是在学习 北京邮电大学 崔毅东 老师的《C程序设计 (面向对象进阶)》课程过程中整理的。欢迎前往专栏了解更多相关内容~ 😀 有关于现代 C 的基本介绍,请前往《现代C基本介绍》! 🔔 先决条件 本专栏的系列…...

Leetcode125. 验证回文串
力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台 如果在将所有大写字符转换为小写字符、并移除所有非字母数字字符之后,短语正着读和反着读都一样。则可以认为该短语是一个 回文串 。 字母和数字都属于字母数字字符。 给你一个字符串 s&…...

【Yellowbrick】特征可视化分析
Yellowbrick特征可视化分析 ⭐Yellowbrick⭐特征分析可视化⭐Rank1D⭐Rank2D ⭐Yellowbrick Yellowbrick是一个用于可视化机器学习模型和评估性能的Python库。它提供了一系列高级可视化工具,帮助数据科学家和机器学习从业者更好地理解、调试和优化他们的模型。 它在…...

Android大厂需要刷的(999道)面试题
想必大家都在为今年的金九银十做准备,今年也是最为艰难的一年。作为程序员从未感觉到如此艰难,身边不是被辞退就是找不到工作。先不说2023年应届生毕业即失业,作为开发15年的老Android程序员,现在也在和300个人挣一个岗位。 肉少…...

Pycharm中出现ImportError:DLL load failed:找不到指定模块的解决方法
不论搭建什么工程,运行什么文件,只要在Pycharm中出现ImportError: DLL load failed: 找不到指定的模块这样的问题,以下方法都适用!!! 一、问题描述 我在使用pycharm连接webots,用python控制机…...

Java设计模式:四、行为型模式-08:策略模式
文章目录 一、定义:策略模式二、模拟场景:策略模式三、违背方案:策略模式3.0 引入依赖3.1 工程结构3.2 优惠券折扣计算类3.3 单元测试 四、改善代码:策略模式4.1 工程结构4.2 策略模式结构图4.3 优惠券折扣实现4.3.1 定义优惠券接…...

ICCOA蓝牙数字车钥匙2.0
近期,ICCOA智慧车联开放联盟宣布,由小米、vivo、OPPO、长安、深蓝、吉利、极氪、比亚迪、北汽、蔚来、零跑、雪球、瓶钵、融卡等企业联合参与制定的ICCOA蓝牙数字车钥匙2.0标准(简称DK2.0),于2023年9月1日正式发布实施…...

ArcGIS土地利用程度综合指数分析
成图展示: 土地利用程度综合指数 第一步 准备数据 使用的数据为2010年河南省土地利用类型数据与其行政区划县级数据(为了节省操作,这里使用上次实验的部分数据[1],各土地利用类型已被提取) 第二步 面积统计 水域为例…...

服务端请求伪造(SSRF)及漏洞复现
文章目录 渗透测试漏洞原理服务端请求伪造1. SSRF 概述1.1 SSRF 场景1.1.1 PHP 实现 1.2 SSRF 原理1.3 SSRF 危害 2. SSRF 攻防2.1 SSRF 利用2.1.1 文件访问2.1.2 端口扫描2.1.3 读取本地文件2.1.4 内网应用指纹识别2.1.5 攻击内网Web应用 2.2 SSRF 经典案例2.2.1 访问页面2.2.…...

v-model和v-bind
v-model,它其实就是一个语法糖,作用就是双向绑定表单控件(radio, text,address,email,select,checkbox,textarea) v-bind(简写形式:value值),用于绑定属性值,只能实现数据的单项绑定。 <template> <div>…...

详细介绍 弹性盒子(display:flex)
文章目录 什么是弹性盒子 如何使用弹性盒子flex系列flex-direction 对齐方向 水平对齐垂直对齐flex-wrap 换行flex-flowflex模型说明容器的属性 justify-content X轴对齐方式align-content Y轴对齐方式总结属性值Y轴对齐的另外一种:align-itemsalign-content和alig…...

Docker使用数据卷挂载进行数据存储与共享
一、挂载和数据卷 在 Docker 中,挂载(Mounting)和数据卷(Data Volumes)是用于在容器和宿主机之间共享数据的机制。 挂载:将宿主机文件系统中的目录或文件与容器中的目录或文件进行关联的过程。数据卷&…...