【C++】类和对象-继承

0.前言

在这里插入图片描述

1.基本语法

在这里插入图片描述
在这里插入图片描述

继承的用处就是极大的减少代码的重复性,如果没有用继承,看看以下代码,你知道了。。。。

基本实现代码:

#include <iostream>
using namespace std;
/******************************************/void test01();/******************************************/
int main()
{/******************************************/test01();/******************************************/system("pause");return 0;
}//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;}
};
//Cpp页面
class Cpp {
public:void header() {cout << "首页、公开课、登录、注册...(公共头部)" << endl;}void footer() {cout << "帮助中心、交流合作、站内地图...(公共底部)" << endl;}void left() {cout << "Java,Python,C++...(公共分类列表)" << endl;}void content() {cout << "Cpp学科视频" << endl;}
};void test01() {//Java页面cout << "Java下载视频页面如下:" << endl;Java ja;ja.header();ja.footer();ja.left();ja.content();cout << "——————————————————————————" << endl;//Python页面cout << "Python下载视频页面如下:" << endl;Python py;py.header();py.footer();py.left();py.content();cout << "——————————————————————————" << endl;//Cpp页面cout << "Cpp下载视频页面如下:" << endl;Cpp cpp;cpp.header();cpp.footer();cpp.left();cpp.content();cout << "——————————————————————————" << endl;
}

继承实现代码

#include <iostream>
using namespace std;
/******************************************/void test01();/******************************************/
int main()
{/******************************************/test01();/******************************************/system("pause");return 0;
}//公共页面
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;}
};
//Cpp页面
class Cpp :public BasePage {
public:void content() {cout << "Cpp学科视频" << endl;}
};void test01() {//Java页面cout << "Java下载视频页面如下:" << endl;Java ja;ja.header();ja.footer();ja.left();ja.content();cout << "——————————————————————————" << endl;//Python页面cout << "Python下载视频页面如下:" << endl;Python py;py.header();py.footer();py.left();py.content();cout << "——————————————————————————" << endl;//Cpp页面cout << "Cpp下载视频页面如下:" << endl;Cpp cpp;cpp.header();cpp.footer();cpp.left();cpp.content();cout << "——————————————————————————" << endl;
}

2.继承方式

在这里插入图片描述
在这里插入图片描述

#include <iostream>
using namespace std;
/******************************************///公共继承
class Base1 {
public:int m_A;
protected:int m_B;
private:int m_C;
};
class Son1 :public Base1 {
public:void func() {m_A = 100;//父类中的公共权限成员 到子类中依然是公共权限m_B = 100;//父类中的保护权限成员 到子类中依然是保护权限//m_C = 100;//父类中的私有权限成员 子类访问不到}
};
void test01() {Son1 s1;s1.m_A = 100;  //到Son1中 m_B是公共权限 类外可以访问//s1.m_B = 100;//到Son1中 m_B是保护权限 类外访问不到//s1.m_C = 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 = 100;//父类中公共成员,到子类中变为了保护权限m_B = 100;//父类中保护成员,到子类中变为了保护权限//m_C = 100;//父类中私有成员 子类访问不到}
};
void test02() {Son2 s2;//s2.m_A = 100;//在Son2中 m_A变为保护权限 ,因此类外访问不到//s2.m_B = 100;//在Son2中 m_B保护权限 不可以访问//s2.m_C = 100;//在Son2中 m_B私有权限 不可以访问
}//私有继承
class Base3 {
public:int m_A = 100;
protected:int m_B = 100;
private:int m_C = 100;
};
class Son3 :private Base3 {
public:void func() {m_A = 100;//父类中公共成员,到子类中变为了私有权限m_B = 100;//父类中保护成员,到子类中变为了私有权限//m_C = 100;//父类中私有成员 子类访问不到}
};
void test03() {Son3 s3;//s3.m_A = 100;//在Son3中 m_A变为私有权限 ,因此类外访问不到//s3.m_B = 100;//在Son3中 m_A变为私有权限 ,因此类外访问不到//s3.m_C = 100;//在Son3中 m_B私有权限 不可以访问
}//孙类访问父类
class GrandSon2 :public Son2 {
public:void func() {m_A = 100;//在Son2中 m_A变成了保护权限 孙类可以类内访问m_B = 100;//在Son2中 m_B仍然为保护权限 孙类可以类内访问//m_C = 100;//父类中私有成员 子类访问不到 孙类也访问不到}
};class GrandSon3 :public Son3 {
public:void func() {//m_A = 100;//在Son3中 m_A变成了私有权限 孙类访问不到//m_B = 100;//在Son3中 m_B变成了私有权限 孙类访问不到//m_C = 100;//父类中私有成员 子类访问不到 孙类也访问不到}
};/******************************************/
int main()
{/******************************************/test01();test03();test02();/******************************************/system("pause");return 0;
}

3.继承中的对象模型

在这里插入图片描述
在这里插入图片描述

代码

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

利用开发人员命令提示工具查看对象模型:
在这里插入图片描述
其具体步骤如下:
在这里插入图片描述
在这里插入图片描述
如果不清楚,去跳转网址:

https://www.bilibili.com/video/BV1et411b73Z?p=129&spm_id_from=pageDriver&vd_source=fb8dcae0aee3f1aab700c21099045395

从05:55开始观看

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

在这里插入图片描述
**总结:**继承中 先调用父类构造函数,再调用子类构造函数,析构顺序与构造相反

#include <iostream>
using namespace std;
/******************************************/
//继承中的构造和析构函数
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;
/******************************************/
class Base {
public:Base() {m_A = 100;}void func() {cout << "Son-func()调用" << endl;}void func(int a) {cout << "Base-func(int a)调用" << endl;}
public:int m_A;
};class Son :public Base {
public:Son() {m_A = 200;}//当子类与父类拥有同名的成员函数,子类会隐藏父类中所有版本的同名成员函数//如果想访问父类中被隐藏的同名成员函数,需要加父类的作用域void func() {cout << "Son-func()调用" << endl;}public:int m_A;
};void test01() {Son s;//子类对象加作用域才可以访问到父类同名成员cout << s.m_A << endl << s.Base::m_A << endl;s.func();s.Base::func();s.Base::func(12);
}
/******************************************/
int main()
{/******************************************/test01();/******************************************/system("pause");return 0;
}

结果
在这里插入图片描述

6.继承同名静态成员处理方式

在这里插入图片描述
在这里插入图片描述
代码

#include <iostream>
using namespace std;
/******************************************/
class Base {
public:static int m_A;static void func() {cout << "Base-func()调用" << endl;}static void func(int a) {cout << "Base-func(int a)调用" << endl;}
};
int Base::m_A = 100;
class Son :public Base {
public:static int m_A;static void func() {cout << "Son-func()调用" << endl;}
};
int Son::m_A = 200;void test01() {cout << "同名成员属性:" << endl;//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;//第一个::代表通过类名方式访问  第二个::代表访问父类作用域下的m_Acout << "Base m_A = " << Son::Base::m_A << endl << endl << endl;;cout << "同名函数属性:" << endl;//1、通过对象访问cout << "通过对象访问:" << endl;Son s2;s2.func();s2.Base::func();//2、通过类名访问cout << "通过类名访问:" << endl;Son::func();Son::Base::func();//出现同名,子类会隐藏掉父类中所有同名成员函数,需要加作用域访问Son::Base::func(100);
}
/******************************************/
int main()
{/******************************************/test01();/******************************************/system("pause");return 0;
}

结果:
在这里插入图片描述

7.多继承语法

在这里插入图片描述
在这里插入图片描述
代码:

#include <iostream>
using namespace std;
/******************************************/
class Base1 {
public:Base1() {m_A = 100;}
public:int m_A;
};
class Base2 {
public:Base2() {m_A = 200;//开始是m_B 不会出问题 ,但是改为m_A就出现不明确}
public:int m_A;
};//语法: class 子类:继承方式 父类1,继承方式 父类2,.....
class Son :public Base1, public Base2 {
public:Son() {m_A = 300;m_D = 400;}
public:int m_A;int m_D;
};//多继承容易产生成员同名的情况
//通过使用类名作用域可以区分调用哪个基类的成员
void test01() {Son s;cout << "size of Son = " << sizeof(s) << endl;cout << "Base1:m_A = " << s.Base1::m_A << endl;cout << "Base2:m_A = " << s.Base1::m_A << endl;cout << "Son:m_A = " << s.m_A << endl;
}
/******************************************/
int main()
{/******************************************/test01();/******************************************/system("pause");return 0;
}

结果:
结果
利用开发人员命令提示工具查看对象模型:
在这里插入图片描述

8.菱形继承

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
如果没有用虚继承,会导致有歧义,相当于两个父类、多继承的不明确问题
在这里插入图片描述
代码

#include <iostream>
using namespace std;
/******************************************/
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 = 19;st.Tuo::m_Age = 29;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/19475.shtml

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

相关文章

万界星空/推出生产制造执行MES系统/开源MES/免费下载

免费MES系统介绍 什么是MES系统呢&#xff1f;MES系统主要功能就是解决“如何生产”的问题。通过实施MES系统&#xff0c;一站式解决您所困扰的所有生产制作流程问题。 普通的免费MES系统只提供简单的基本功能让客户体验&#xff0c;而万界星空MES系统运用低代码的形式开发&a…

【二开】JeecgBoot-vue3二次开发 前端 扩展online表单js增强等-初始化列表之后执行

【二开】JeecgBoot-vue3二次开发 前端 扩展online表单js增强等-初始化列表之后执行 二开位置 OnlineAutoList.js.initAutoList 定义方法 /*** 初始化列表之后执行* js增强* param tableColumns* returns {Promise<void>|*}*/onlineTableContext["afterInitAutoList…

Codeforces Round 855 (Div. 3) E题题解

文章目录 [ Unforgivable Curse (hard version)](https://codeforces.com/contest/1800/problem/E2)问题建模问题分析方法1分析性质1.分析操作对元素位置的影响2.分析可以使用操作的元素可以与相邻元素交换位置的作用代码 方法2通过DFS得到相互可以交换位置的字符集合代码 方法…

Spring Boot的自动配置原理

一.原理解释 Spring Boot的自动配置是Spring框架的一个重要特性&#xff0c;它旨在简化应用程序的开发和部署过程。自动配置通过基于类路径中的依赖关系和配置文件内容来预先配置Spring应用程序的各种组件和功能。这样&#xff0c;我们可以在无需显式配置大量参数的情况下&…

消息中间件应用场景介绍

提高系统性能首先考虑的是数据库的优化&#xff0c;但是数据库因为历史原因&#xff0c;横向扩展是一件非常复杂的工程&#xff0c;所有我们一般会尽量把流量都挡在数据库之前。 不管是无限的横向扩展服务器&#xff0c;还是纵向阻隔到达数据库的流量&#xff0c;都是这个思路。…

更安全,更省心丨DolphinDB 数据库权限管理系统使用指南

在数据库产品使用过程中&#xff0c;为保证数据不被窃取、不遭破坏&#xff0c;我们需要通过用户权限来限制用户对数据库、数据表、视图等功能的操作范围&#xff0c;以保证数据库安全性。为此&#xff0c;DolphinDB 提供了具备以下主要功能的权限管理系统&#xff1a; 提供用户…

STM32 DMA学习

DMA简称 DMA&#xff0c;Direct Memory Access&#xff0c;即直接存储器访问。DMA传输方式无需CPU直接控制传输&#xff0c;也没有中断处理方式那样保留现场和恢复现场的过程&#xff0c;通过硬件为RAM与I/O设备开辟一条直接传送数据的通路&#xff0c;能使CPU的效率大为提高。…

LabVIEW开发航天器动力学与控制仿真系统

LabVIEW开发航天器动力学与控制仿真系统 计算机仿真是工程设计和验证的非常有用的工具。它节省了大量的时间、金钱和精力。航天器动力学与控制仿真系统由LabVIEW程序开发&#xff0c;它是模拟航天器等动态系统的有用工具。还可轻松与硬件连接并输出真实信号。 项目采用系统工…

偷懒神器-->花样的代码生成工具

1、CRUD代码生成&#xff1a; 根据MyBatisPlus逆向工程改造而来&#xff0c;添加了showDoc文档生成&#xff0c;数据库脚本生成&#xff0c;增删改查文件生成&#xff0c;Po、Vo、Request对象生成等。普通的增删改查一般搞定。并预调了部份判断逻辑。 效果示例&#xff1a; p…

“用户登录”测试用例总结

前言&#xff1a;作为测试工程师&#xff0c;你的目标是要保证系统在各种应用场景下的功能是符合设计要求的&#xff0c;所以你需要考虑的测试用例就需要更多、更全面。鉴于面试中经常会问“”如何测试用户登录“”&#xff0c;我们利用等价类划分、边界值分析等设计一些测试用…

git的clone,上传,mirror与upstream同步

文章目录 clone日志信息的同步子树合并同步 clone clone他人项目&#xff0c;git到自己的项目 rm -rf .git .git存放原始项目的日志信息&#xff0c;这里需要添加自己的日志信息&#xff0c;需要删除重写。也可手动删除 git init 初始化文件&#xff0c;依据本地日志信息生产.…

Gradle和Maven的区别

Gradle和Maven 当涉及到构建和管理项目时&#xff0c;Gradle和Maven是两个非常流行的选项。本文将讨论Gradle和Maven之间的区别以及它们的配置信息差异。 1. Gradle和Maven的区别 1.1 构建脚本语言 Maven使用XML作为构建脚本语言&#xff0c;而Gradle使用基于Groovy的DSL&…

c 语言解析 时间字符串

#include <iostream> #include <ctime>int main(int argc, char *argv[]) {struct tm timeinfo;char cur_time[] "current time: 2021-09-06 23:50:13";// 解析时间到timeinfo中strptime(cur_time, "current time: %Y-%m-%d %H:%M:%S", &…

查看内存类型和频率 - Win系统

查看内存类型和频率 - Win系统 问题方法1&#xff08;推荐&#xff09;&#xff1a;使用命令行方法2&#xff1a;使用CPU-Z方法3&#xff1a;使用AIDA64 问题 我们在为电脑扩充内存时需要提前了解电脑内存的类型和频率&#xff0c;防止内存不兼容&#xff0c;但在设备管理器和…

java+springboot+mysql疫情物资管理系统

项目介绍&#xff1a; 使用javaspringbootmysql开发的疫情物资管理系统&#xff0c;系统包含超级管理员&#xff0c;系统管理员、员工角色&#xff0c;功能如下&#xff1a; 超级管理员&#xff1a;管理员管理&#xff1b;部门管理&#xff1b;职位管理&#xff1b;员工管理&…

基于STM32设计的数显热水器

一、项目介绍 当前介绍的项目是基于 STM32F103ZET6 系列 MCU 设计的数显热水器&#xff0c;通过显示屏来显示热水器的温度及其工作状态&#xff0c;通过 PT100 传感器来检测热水器的温度变化&#xff0c;并通过电加热片实现加热过程&#xff0c;以达到控制热水器温度的目的。 …

结构思考力-有效提升你的工作效率20倍以上

结构思考力是一种帮助人们察觉并改善自身思考结构的思考艺术&#xff0c;它将人们的思维表达以一种逻辑结构的形式来表示&#xff0c;从而简化人与人之间的沟通成本&#xff0c;提高工作效率。每个人思考问题的方式不同&#xff0c;不同的思考结构使人们的注意力的方向也不同&a…

机房环境、动力、网络、安防,帮您提高运维效率,确保机房安全

机房作为单位的核心部门&#xff0c;由计算机、服务器、网络设备、存储设备等关键设备组成&#xff0c;智能化计算机机房这个概念在各个领域中&#xff0c;已经占据了很重要的地位&#xff0c;伴随着国家大力倡导的&#xff0c;东数西算&#xff0c;数字经济、云计算、5G大数据…

IPC进程间通信探索——管道的原理与特点

&#x1f923; 爆笑教程 &#x1f449; 《看表情包学Linux》 &#x1f525; CSDN 累计订阅量破千的火爆 C/C 教程的 2023 重制版&#xff0c;C 语言入门到实践的精品级趣味教程。了解更多&#xff1a; &#x1f449; "不太正经" 的专栏介绍 ← 试读第一章订阅链接&am…

深度学习之tensorboard可视化工具

(1)什么是tensorboard tensorboard是TensorFlow 的一个可视化工具包&#xff0c;提供机器学习实验所需的可视化和工具&#xff0c;该工具的功能如下&#xff1a; 跟踪和可视化指标&#xff0c;例如损失和精度可视化模型图&#xff08;操作和层&#xff09;查看权重、偏差或其…