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

news2024/11/25 5:57:34

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.coloradmin.cn/o/977971.html

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

相关文章

IDEA爪哇操作数据库

少小离家老大回,乡音无改鬓毛衰 ⒈.IDEA2018设置使用主题颜色 IDEA2018主题颜色分为三种&#xff1a;idea原始颜色&#xff0c;高亮色&#xff0c;黑色 设置方法&#xff1a;Settings–Appearance&Behavior–Appearance ⒉.mysql中&#xff0c;没有my.ini&#xff0c;只有…

计算机视觉中的自监督学习

如何只使用少量标记示例来训练模型&#xff1f; 到目前为止&#xff0c;人工智能所提供的大部分价值都来自于在日益庞大的数据集上训练的监督模型。其中许多数据集都是由人类标记的&#xff0c;这是一项枯燥、耗时、容易出错&#xff0c;有时还很昂贵的工作。自监督学习&#x…

JVM基础面试题

JDK、JRE、JVM的关系 JVM Java虚拟机&#xff0c;它只识别.class类型文件&#xff0c;它能将class文件中的字节码指令进行识别并调用操作系统向上的API完成动作。 JRE Java运行时环境。它主要包含两部分&#xff1a;Jvm的标准实现和Java的一些基本类库。相对于JVM来说,JRE多出来…

【狂神】SpringMVC笔记(一)之详细版

1.Restful 风格 概念&#xff1a; 实现方式&#xff1a; 使用PathVariable 在url相同的情况下&#xff0c;会根据请求方式的不同来执行不同的方法。 使用RestFull风格的好处&#xff1a;简洁、高效、安全 2、接受请求参数及数据回显 2.1、请求参数 方式一&#xff1a;这里…

无涯教程-JavaScript - TIME函数

描述 TIME函数返回特定时间的十进制数。如果在输入功能之前单元格格式为"常规",则输出格式为日期。 TIME返回的十进制数是一个介于0(零)到0.99988426之间的值,代表从0:00:00(12:00:00 AM)到23:59:59(11:59:59 P.M.)的时间。 语法 TIME (hour, minute, second)争论…

Android studio 调整jar包顺序

第一步&#xff1a;编译jar包&#xff0c;放入lib路径下&#xff1a;如&#xff1a; 第二步&#xff1a;app 目录下build.gradle 中添加 compileOnly files(libs/classes.jar) 第三步&#xff1a;project目录下build.gradle 中添加 allprojects {gradle.projectsEvaluated {t…

十四、MySQL(DCL)如何实现用户的简单管理?配置用户?

1、DCL语句&#xff1a; 要学习DCL语言&#xff0c;就要清楚DCL语言是用来干什么的&#xff0c;首先DCL语言英文全称是Data Control Language&#xff0c;是数据控制语言&#xff0c;主要用来管理数据库用户、控制数据库的访问权限/ 2、DCL的基础语法&#xff1a; &#xff08;…

SpringBoot项目启动时预加载

SpringBoot项目启动时预加载 Spring Boot是一种流行的Java开发框架&#xff0c;它提供了许多方便的功能来简化应用程序的开发和部署。其中一个常见的需求是在Spring Boot应用程序启动时预加载一些数据或执行一些初始化操作。 1. CommandLineRunner 和 ApplicationRunner Spri…

垃圾回收 - 标记压缩算法

压缩算法是将标记清除算法与复制算法相结合的产物。 1、什么是标记压缩算法 标记压缩算法是由标记阶段和压缩阶段构成。 首先&#xff0c;这里的标记阶段和标记清除算法时提到的标记阶段完全一样。 接下来我们要搜索数次堆来进行压缩。压缩阶段通过数次搜索堆来重新填充活动对…

mtbatisplus

title: mybatis_plus date: 2023-09-03 21:06:27 tags: mybatis_plusreviews 约定大于配置 默认 当我们要使用mybatisplus的时候 我们需要去集成mp提供的BaseMapper public interface UserMapper extends BaseMapper 关于mybatisplus常用注解 注解到类上 TableName(“表…

【c++】只出现一次的数字I II III(三个版本:三道题)

注&#xff1a;看这篇文章之前你需要了解& | ^ << >> 这五个运算符&#xff0c;此外&#xff0c;代码均经过测试运行通过 目录 1、只出现一次的数字I&#xff08;难度&#xff1a;简单&#xff09; 2、只出现一次的数字II&#xff08;难度&#xff1a;中等&a…

Ubuntu之apt-get系列--apt-get安装软件的方法/教程

原文网址&#xff1a;Ubuntu之apt-get系列--apt-get安装软件的方法/教程_IT利刃出鞘的博客-CSDN博客 简介 本文介绍Ubuntu使用apt-get安装软件的方法。 安装软件 先更新列表 sudo apt-get update 安装软件 sudo apt-get install <package name>[<version>]…

importlib的使用、9个视图子类、视图集、drf之路由、drf之请求响应回顾、GenericViewSet相关流程图

一 drf之请求响应回顾 # 1 drf请求-请求对象&#xff1a;data&#xff0c;query_params&#xff0c;其他跟之前一样&#xff0c;FILES-默认&#xff1a;支持三种编码-局部配置&#xff1a;视图类中-from rest_framework.parsers import JSONParser, FormParser, MultiPartPars…

MySQL的故事——MySQL架构与历史

MySQL架构与历史 文章目录 MySQL架构与历史一、MySQL逻辑架构二、并发控制三、事务四、多版本并发控制(MVCC) 一、MySQL逻辑架构 第一层&#xff1a;连接处理、授权认证、安全等等 第二层&#xff1a;查询解析、分析、优化、缓存以及所有的内置函数。包含跨存储引擎的功能&…

【数据结构与算法】十大经典排序算法

文章目录 前言一、常见十大排序算法总结1、名词解释2、时间复杂度 二、排序算法与C语言实现1、冒泡排序2、选择排序3、插入排序4、希尔排序5、归并排序6、快速排序7、堆排序8、计数排序9、桶排序10、基数排序 总结 前言 排序算法是《数据结构与算法》中最基本的算法之一。 排序…

java:操作cookie

背景 cookie 是一种客户端会话技术&#xff0c;将数据保存到客户端。主要流程就是&#xff1a; 1、服务器把数据设置到cookie并返回给浏览器 2、浏览器自动保存 3、浏览器下一次发送请求自动携带cookie给服务器 我们主要来看一下 java 是怎么操作 cookie 的。 cookie介绍 特…

区块链技术与应用 - 学习笔记2【密码学基础】

大家好&#xff0c;我是比特桃。本系列笔记只专注于探讨研究区块链技术原理&#xff0c;不做其他违反相关规定的讨论。 区块链技术已被纳入国家十四五规划&#xff0c;在“加快数字发展 建设数字中国”篇章中&#xff0c;区块链被列为“十四五”七大数字经济重点产业之一&#…

Node.js安装使用

目录 一、安装 Node.js二、环境变量配置三、npm常用命令 Node.js 是一个强大的运行时环境&#xff0c;它使您能够在服务器端运行 JavaScript 代码。它非常流行&#xff0c;用于构建 Web 应用程序、API 和各种后端服务。 一、安装 Node.js 1、访问 Node.js 官方网站。 在主页上…

算法训练day34|贪心算法 part03(LeetCode 1005.K次取反后最大化的数组和、134. 加油站、135. 分发糖果(处理一边再处理一边))

文章目录 1005.K次取反后最大化的数组和思路分析代码实现 134. 加油站暴力方法贪心方法 135. 分发糖果(处理一边再处理一边)思路分析代码实现思考总结 1005.K次取反后最大化的数组和 题目链接&#x1f525; 给定一个整数数组 A&#xff0c;我们只能用以下方法修改该数组&#…

使用redis实现队列功能

使用redis实现队列功能 操作方法描述LPUSHLong lPush(String key, String… values)将一个或多个值 value 插入到列表 key 的表头&#xff0c;返回插入后列表中value的数量&#xff0c;若key不存在&#xff0c;会创建一个新的列表并执行 LPUSH 操作RPOPLPUSHString rPopLPush(S…