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

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.mzph.cn/news/69599.shtml

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

相关文章

【精品】NLP自然语言处理学习路线(知识体系)

当前&#xff0c;大规模预训练语言模型的强大对话问答、文本生成能力&#xff0c;将自然语言处理&#xff08;NLP&#xff09;的研究和应用推向了新一轮的热潮。NLP是计算机科学、人工智能和语言学等学科交叉的前沿领域。NLP的应用和研究范围非常的广泛&#xff0c;个人是没有找…

利用GitHub实现域名跳转

利用GitHub实现域名跳转 一、注册一个 github账号 你需要注册一个 github账号,最好取一个有意义的名字&#xff0c;比如姓名全拼&#xff0c;昵称全拼&#xff0c;如果被占用&#xff0c;可以加上有意义的数字. 本文中假设用户名为 UNIT-wuji(也是我的博客名) 地址: https:/…

Git常用命令用法

参考视频&#xff1a;真的是全能保姆 git、github 保姆级教程入门&#xff0c;工作和协作必备技术&#xff0c;github提交pr - pull request_哔哩哔哩_bilibili 1.Git初始化 首先设置名称和邮箱。然后初始化一下&#xff0c;然后就创建了一个空的Git仓库。 PS D:\golang\oth…

node socket.io

装包&#xff1a; yarn add socket.io node后台&#xff1a; const express require(express) const http require(http) const socket require(socket.io) const { getUserInfoByToken } require(../../utils/light/tools)let app express() const server http.createS…

【C++漂流记】结构体的定义和使用、结构体数组、结构体指针、结构体做函数参数以及结构体中const的使用

结构体&#xff08;struct&#xff09;是C语言中一种重要的数据类型&#xff0c;它由一组不同类型的成员组成。结构体可以用来表示一个复杂的数据结构&#xff0c;比如一个学生的信息、一个员工记录或者一个矩形的尺寸等。 结构体定义后&#xff0c;可以声明结构体变量&#xf…

NCCoE发布“向后量子密码学迁移”项目进展情况说明书

近日&#xff0c;NIST下属的国家网络安全中心&#xff08;NCCoE&#xff09;发布了一份向后量子密码学迁移&#xff08;Migration to Post-Quantum Cryptography&#xff09;项目情况说明书。该文档简要概述了向后量子密码学迁移项目的背景、目标、挑战、好处和工作流程&#x…

【HTML5高级第二篇】WebWorker多线程、EventSource事件推送、History历史操作

文章目录 一、多线程1.1 概述1.2 体会多线程1.3 多线程中数据传递和接收 二、事件推送2.1 概述2.2 onmessage 事件 三、history 一、多线程 1.1 概述 前端JS默认按照单线程去执行&#xff0c;一段时间内只能执行一件事情。举个栗子&#xff1a;比方说古代攻城游戏&#xff0c…

Jenkins自动构建(Gitee)

Gitee简介安装JenkinsCLI https://blog.csdn.net/tongxin_tongmeng/article/details/132632743 安装Gitee jenkins-cli install-plugin gitee:1.2.7 # https://plugins.jenkins.io/gitee/releases获取安装命令(稍作变更) JenkinsURL Dashboard-->配置-->Jenkins Locatio…

鸿蒙系列-如何使用好 ArkUI 的 @Reusable?

如何使用好 ArkUI 的 Reusable&#xff1f; OpenHarmony 组件复用机制 在ArkUI中&#xff0c;UI显示的内容均为组件&#xff0c;由框架直接提供的称为 系统组件&#xff0c;由开发者定义的称为 自定义组件。 在进行 UI 界面开发时&#xff0c;通常不是简单的将系统组件进行组合…

NIO原理浅析(三)

epoll 首先认识一下epoll的几个基础函数 int s socket(AF_INET, SOCK_STREAM, 0); bind(s, ...); listen(s, ...);int epfd epoll_create(...) epoll_ctl(epfd, ...); //将所有需要监听的socket添加到epfd中while(1) {int n epoll_wait(...);for(接受到数据的socket) {//处…

Kotlin 环境下解决属性初始化问题

&#x1f337;&#x1f341; 博主猫头虎&#xff08;&#x1f405;&#x1f43e;&#xff09;带您 Go to New World✨&#x1f341; &#x1f984; 博客首页——&#x1f405;&#x1f43e;猫头虎的博客&#x1f390; &#x1f433; 《面试题大全专栏》 &#x1f995; 文章图文…

react使用hook封装一个tab组件

目录 react使用hook封装一个tab组件Tabbar.jsx使用组件效果 react使用hook封装一个tab组件 Tabbar.jsx import PropsTypes from "prop-types"; import React, { useEffect, useState } from react; export default function Tabbar(props) {const { tabData , cur…

使用pip下载第三方软件包报错超时处理方法

报错如下&#xff1a; WARNING: Retrying (Retry(total4, connectNone, readNone, redirectNone, statusNone)) after connection broken by ‘ReadTimeoutEr ror(“HTTPSConnectionPool(host‘files.pythonhosted.org’, port443): Read timed out. (read timeout15)”)’: /p…

Maven编译java及解决程序包org.apache.logging.log4j不存在问题

1、首先新建一个文件夹&#xff0c;比如hello Hello里新建pom.xml <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi…

git快速使用

1、下载git 设置签名 2、基本概念 工作区&#xff1a;写代码的地方。 暂存区&#xff1a;.git的.index 工作区&#xff1a;.git 3、常用操作 本地codinggit init&#xff0c; 初始化一个本地仓库&#xff0c;项目根目录下会出现个.gitgit remote add origin gitgithub.com…

[杂谈]-快速了解LoRaWAN网络以及工作原理

快速了解LoRaWAN网络以及工作原理 文章目录 快速了解LoRaWAN网络以及工作原理1、LoRaWAN网络元素1.1 终端设备&#xff08;End Devices&#xff09;1.2 网关&#xff08;Gateways&#xff09;1.3 网络服务器&#xff08;Net Server&#xff09;1.4 应用服务器&#xff08;Appli…

OpenCV(二十一):椒盐噪声和高斯噪声的产生

目录 1.图像噪声介绍 2.椒盐噪声的产生 3.高斯噪声的产生 1.图像噪声介绍 噪声介绍 图像噪声是指在图像中存在的不期望的、随机的像素值变化&#xff0c;这些变化来源于多种因素。噪声可能导致图像细节模糊、失真或难以分辨。 以下是几种常见的图像噪声类型&#xff1a; 1…

Unity中神秘的Transform和transform(小写)的关系

1.为什么Transform类是保护的不能通过new 来实例化对象,也没有静态函数,而Rotate()这种方法却属于它,该如何访问? Transform 类还是被保护的不允许用户修改! protected Transform(); 是一个受保护的构造函数,不能直接实例化 Transform 类。 2.为甚么transform可以访问Tr…

Mac Homebrew中常用的 Brew 命令

Mac 中常用的 Brew 命令集 Brew&#xff08;Homebrew&#xff09;是一个强大的包管理器&#xff0c;用于在 macOS 上安装、更新和管理各种软件包。它使得在 Mac 上安装开发工具、应用程序和库变得轻松和便捷。本博客将介绍一些在 Mac 中常用的 Brew 命令&#xff0c;以帮助您更…

【Springcloud】Sentinel熔断和降级

【Springcloud】Sentinel熔断和降级 【一】基本介绍【1】什么是熔断和降级【2】为什么使用熔断和降级【3】Sentinel熔断和降级【4】核心概念 【二】下载方式【1】Windows平台安装包下载【2】打开控制台 【三】使用案例【1】添加依赖【2】添加Sentinel配置【3】添加TestUserCont…