当前位置: 首页 > news >正文

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

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 测评方案

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

JSONUtil详解

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

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指南者》&#xff0c;以及《STM32F10x-中文参考手册》关于FSMC一章节的时候&#xff0c;对于在控制NOR/SRAM的时候使用到的引脚,在提到NOR器件的时候提到了地址复用和非复用接口&#xff0c;一时间没明白是什么东西。 结论 非复用模式…...

操作系统强化认识之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&#xff0c;添加镜像源 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中&#xff0c;模块是一种将功能代码组织成逻辑单元的方式&#xff0c;以便在其他项目中重复使用。有两种主要的模块系统&#xff1a;CommonJS和ES6。 1、CommonJS 在CommonJS中&#xff0c;我们使用require来引入模块&#xff0c;使用module.exports来导出模块。…...

两个线程同步执行:解决乱箭穿心(STL/Windows/Linux)

C自学精简教程 目录(必读) C并发编程入门 目录 多线程同步 线程之间同步是指线程等待其他线程执行完某个动作之后再执行&#xff08;本文情况&#xff09;。 线程同步还可以是像十字路口的红绿灯一样&#xff0c;只允许一个方向的车同行&#xff0c;其他方向的车等待。 本…...

Ubuntu18.04更改镜像源(网易,阿里,清华,中科大,浙大)

一&#xff0c;备份原来的源&#xff08;选做&#xff09; sudo cp /etc/apt/sources.list /etc/apt/sources_init.list 二&#xff0c;更换源 sudo gedit /etc/apt/sources.list 删除原来内容改为新的镜像源 1&#xff0c;清华源 deb https://mirrors.tuna.tsinghua.edu…...

字节码和机器码的区别

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

go学习part21 Redis和Go(2)

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

从0到1学会Git(第二部分):Git的本地操作和管理

写在前面:本文介绍了在本地仓库进行文件的处理以及本地的合并等操作。 前置知识:文件可以处在三个区域&#xff0c;分别为工作区&#xff0c;暂存区和本地仓库&#xff0c;我们此文的目标即是将文件存储在本地仓库中。我们可以将文件的区域理解为&#xff0c;cpu中&#xff0c…...

hive lateral view 实践记录(Array和Map数据类型)

目录 一、Array 1.建表并插入数据 2.lateral view explode 二、Map 1、建表并插入数据 2、lateral view explode() 3、查询数据 一、Array 1.建表并插入数据 正确插入数据&#xff1a; create table tmp.test_lateral_view_movie_230829(movie string,category array&…...

理解 std::thread::join

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

C#循环定时上传数据,失败重传解决方案,数据库标识

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

R语言图形的组合( par(),layout(),par(fig()) )

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

如何为 Flutter 应用程序创建环境变量

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

「C++程序设计 (面向对象进阶)」学习笔记・一

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

Leetcode125. 验证回文串

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

SkyWalking 10.2.0 SWCK 配置过程

SkyWalking 10.2.0 & SWCK 配置过程 skywalking oap-server & ui 使用Docker安装在K8S集群以外&#xff0c;K8S集群中的微服务使用initContainer按命名空间将skywalking-java-agent注入到业务容器中。 SWCK有整套的解决方案&#xff0c;全安装在K8S群集中。 具体可参…...

日语学习-日语知识点小记-构建基础-JLPT-N4阶段(33):にする

日语学习-日语知识点小记-构建基础-JLPT-N4阶段(33):にする 1、前言(1)情况说明(2)工程师的信仰2、知识点(1) にする1,接续:名词+にする2,接续:疑问词+にする3,(A)は(B)にする。(2)復習:(1)复习句子(2)ために & ように(3)そう(4)にする3、…...

Cesium1.95中高性能加载1500个点

一、基本方式&#xff1a; 图标使用.png比.svg性能要好 <template><div id"cesiumContainer"></div><div class"toolbar"><button id"resetButton">重新生成点</button><span id"countDisplay&qu…...

聊聊 Pulsar:Producer 源码解析

一、前言 Apache Pulsar 是一个企业级的开源分布式消息传递平台&#xff0c;以其高性能、可扩展性和存储计算分离架构在消息队列和流处理领域独树一帜。在 Pulsar 的核心架构中&#xff0c;Producer&#xff08;生产者&#xff09; 是连接客户端应用与消息队列的第一步。生产者…...

土地利用/土地覆盖遥感解译与基于CLUE模型未来变化情景预测;从基础到高级,涵盖ArcGIS数据处理、ENVI遥感解译与CLUE模型情景模拟等

&#x1f50d; 土地利用/土地覆盖数据是生态、环境和气象等诸多领域模型的关键输入参数。通过遥感影像解译技术&#xff0c;可以精准获取历史或当前任何一个区域的土地利用/土地覆盖情况。这些数据不仅能够用于评估区域生态环境的变化趋势&#xff0c;还能有效评价重大生态工程…...

Spring AI与Spring Modulith核心技术解析

Spring AI核心架构解析 Spring AI&#xff08;https://spring.io/projects/spring-ai&#xff09;作为Spring生态中的AI集成框架&#xff0c;其核心设计理念是通过模块化架构降低AI应用的开发复杂度。与Python生态中的LangChain/LlamaIndex等工具类似&#xff0c;但特别为多语…...

Spring是如何解决Bean的循环依赖:三级缓存机制

1、什么是 Bean 的循环依赖 在 Spring框架中,Bean 的循环依赖是指多个 Bean 之间‌互相持有对方引用‌,形成闭环依赖关系的现象。 多个 Bean 的依赖关系构成环形链路,例如: 双向依赖:Bean A 依赖 Bean B,同时 Bean B 也依赖 Bean A(A↔B)。链条循环: Bean A → Bean…...

Java求职者面试指南:Spring、Spring Boot、MyBatis框架与计算机基础问题解析

Java求职者面试指南&#xff1a;Spring、Spring Boot、MyBatis框架与计算机基础问题解析 一、第一轮提问&#xff08;基础概念问题&#xff09; 1. 请解释Spring框架的核心容器是什么&#xff1f;它在Spring中起到什么作用&#xff1f; Spring框架的核心容器是IoC容器&#…...

短视频矩阵系统文案创作功能开发实践,定制化开发

在短视频行业迅猛发展的当下&#xff0c;企业和个人创作者为了扩大影响力、提升传播效果&#xff0c;纷纷采用短视频矩阵运营策略&#xff0c;同时管理多个平台、多个账号的内容发布。然而&#xff0c;频繁的文案创作需求让运营者疲于应对&#xff0c;如何高效产出高质量文案成…...

【JavaSE】多线程基础学习笔记

多线程基础 -线程相关概念 程序&#xff08;Program&#xff09; 是为完成特定任务、用某种语言编写的一组指令的集合简单的说:就是我们写的代码 进程 进程是指运行中的程序&#xff0c;比如我们使用QQ&#xff0c;就启动了一个进程&#xff0c;操作系统就会为该进程分配内存…...