类和对象-继承

师从黑马程序员

基本语法

有些类与类之间存在特殊的关系,例如:

定义这些类时,下一级别的成员除了拥有上一级的共性,还有自己的特性。

这时候我们就可以考虑继承技术,减少重复代码

语法:class 子类:继承方式  父类

子类也称为派生类          父类也称为 基类

#include <iostream>
#include <string>
using namespace std;/*
//普通实现页面//Java页面
class Java
{
public:void header(){cout<<"首页、公开课、登录、注册...(公共头部)"<<endl;}void footer(){cout<<"帮助中心、交流合作、站内地图..."<<endl;}void left(){cout<<"Java\Python、C++...(公共分类列表)"<<endl;}void content(){cout<<"Java学科视频"<<endl;}
};
//Pythin页面
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<<"Java下载视频页面如下:"<<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;
}

继承方式

公共继承              保护继承            私有继承

#include <iostream>
#include <string>
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=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:public 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;//到了son1中m_B是保护权限 不可以访问
}//私有继承
class Base3
{
public:int m_A;
protected:int m_B;
private:int m_C;
};class Son3:public Base3
{
public:void func(){m_A=100;//父类中的公共权限成员 到子类中是私有权限m_B=100;//父类中的保护权限成员 到子类中是私有权限// m_C=100;//父类中的私有权限成员 子类访问不到}
};class GrandSon3:public Son3
{
public:void func(){//m_A=1000;//到了Son3中 m_A变为私有,即使是儿子,也是访问不到//m_B=1000;//到了Son3中 m_B变为私有,即使是儿子,也是访问不到}
};void test03()
{Son2 s1;//s1.m_A=1000;//在Son2中 m_A变为保护权限 类外访问不到//s1.m_B=1000;//到了son1中m_B是保护权限 不可以访问
}void test03()
{Son3 s1;//s1.m_A=1000;//到了Son3中 m_A变为私有,即使是儿子,也是访问不到//s1.m_B=1000;//到了Son3中 m_B变为私有,即使是儿子,也是访问不到}int main()
{test01();system("pause");return 0;
}

继承中的对象模型

开发人员命令提示工具查看对象模型的方法

1、跳转盘符     例:跳转F盘  则打出  F:

2、跳转文件路径 cd 具体路径下

3、查看命名   打出dir

4、 cl /d1 reportSingleClassLayout类名 文件名

#include <iostream>
#include <string>
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;
};void test01()
{//父类中所有非静态成员属性都会被子类继承下去//父类中私有成员属性 是被编译器给隐藏了,因此是访问不到,但确实被继承下去了cout<<"size of Son="<<sizeof(Son)<<endl;//16
}int main()
{test01();system("pause");return 0;
}

继承中构造和析构顺序

子类继承父类后,当创建 子类对象,也会调用父类的构造函数

#include <iostream>
#include <string>
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()
{//Base b;//继承中的构造和析构顺序如下://先构造父类,再构造子类,析构的顺序与构造的顺序相反Son s;
}int main()
{test01();system("pause");return 0;
}

继承同名成员处理方式

访问子类同名成员  直接访问即可

访问父类同名成员 需要加作用域

#include <iostream>
#include <string>
using namespace std;class Base
{
public:Base(){m_A=100;}void func(){cout<<"Base -func()调用"<<endl;}void func(int a){cout<<"Base -func(int)调用"<<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;//200//如果通过子类对象 访问到父类中同名成员,需要加作用域cout<<"Base下 m_A= "<<s.Base::m_A<<endl;//100}//同名成员函数处理
void test02()
{Son s;s.func();//直接调用 调用是子类中的同名成员s.Base::func();//调用是父类中的同名成员//如果子类中出现和父类同名的成员函数,子类的同名成员会隐藏掉父类中所有同名成员函数//s.func(100);wrong//如果想访问到父类中被隐藏的同名成员函数,需要加作用域s.Base::func(100);
}int main()
{//test01();test02();system("pause");return 0;
}

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

静态成员和非静态成员出现同名,处理方式一致

访问子类同名成员  直接访问即可

访问父类同名成员 需要加作用域

#include <iostream>
#include <string>
using namespace std;class Base
{
public:static int m_A;static void func(){cout<<"Base -static void func()"<<endl;}static void func(int a){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.Son::m_A << endl; // 访问 Son 类的静态变量cout << "Base 下m_A=" << s.Base::m_A << endl; // 访问 Base 类的静态变量//2、通过类名访问cout<<"通过类名访问"<<endl;cout<<"Son 下m_A ="<<Son::m_A<<endl;//第一个::代表通过类名各方式访问  第二个::代表访问父类作用域下cout<<"Base 下m_A ="<<Son::Base::m_A<<endl;}//同名静态成员函数
void test02()
{//1、通过对象访问Son s;s.func();s.Base::func();//2、通过类名访问cout<<"通过类名访问"<<endl;Son::func();Son::Base::func();//子类出现和父类同名静态函数,也会隐藏父类中所有同名成员函数//如果想访问父类中被隐藏同名成员,需要加作用域Son::Base::func(100);
}int main()
{test01();system("pause");return 0;
}

多继承语法

语法:class 子类:继承方式  父类1,继承方式  父类2...

多继承可能会引发父类中有同名成员出现,需要加作用域区分

C++实际开发中不建议用多继承

#include <iostream>
#include <string>
using namespace std;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;
}

菱形继承(钻石继承)

概念:

两个派生类继承同一个基类

又有某个类同时继承两个派生类

#include <iostream>
#include <string>
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=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.rhkb.cn/news/272313.html

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

相关文章

【鸿蒙 HarmonyOS 4.0】应用状态:LocalStorage/AppStorage/PersistentStorage

一、介绍 如果要实现应用级的&#xff0c;或者多个页面的状态数据共享&#xff0c;就需要用到应用级别的状态管理的概念。 LocalStorage&#xff1a;页面级UI状态存储&#xff0c;通常用于UIAbility内、页面间的状态共享。AppStorage&#xff1a;特殊的单例LocalStorage对象&…

Android Studio下载gradle超时问题解决

方法一 1. 配置根目录的setting.gradle.kts文件 pluginManagement {repositories {maven { urluri ("https://www.jitpack.io")}maven { urluri ("https://maven.aliyun.com/repository/releases")}maven { urluri ("https://maven.aliyun.com/repos…

【Pytorch、torchvision、CUDA 各个版本对应关系以及安装指令】

Pytorch、torchvision、CUDA 各个版本对应关系以及安装指令 1、名词解释 1.1 CUDA CUDA&#xff08;Compute Unified Device Architecture&#xff09;是由NVIDIA开发的用于并行计算的平台和编程模型。CUDA旨在利用NVIDIA GPU&#xff08;图形处理单元&#xff09;的强大计算…

SpringCloudGateway全局过滤器

文章目录 全局过滤器的作用自定义全局过滤器过滤器执行的顺序 上一篇 Gateway理论与实践 介绍的过滤器&#xff0c;网关提供了31种&#xff0c;但每一种过滤器的作用都是固定的。如果我们希望拦截请求&#xff0c;做自己的业务逻辑则没办法实现。 全局过滤器的作用 全局过滤器的…

App前端开发跨平台框架比较:React Native、Flutter、Xamarin等

引言 移动应用开发领域的跨平台框架正在不断演进&#xff0c;为开发者提供更多选择。在本文中&#xff0c;我们将比较几个流行的跨平台框架&#xff1a;React Native、Flutter和Xamarin等。讨论它们的优缺点、适用场景以及开发体验。 第一部分 React Native: 优缺点、适用场景…

大模型时代下的自动驾驶研发测试工具链-SimCycle

前言&#xff1a; 最近OpenAI公司的新产品Sora的发布&#xff0c;正式掀起了AI在视频创作相关行业的革新浪潮&#xff0c;AI不再仅限于文本、语音和图像&#xff0c;而直接可以完成视频的生成&#xff0c;这是AI发展历程中的又一座重要的里程碑。AI正在不断席卷着过去与我们息…

接口自动化框架(Pytest+request+Allure)

前言&#xff1a; 接口自动化是指模拟程序接口层面的自动化&#xff0c;由于接口不易变更&#xff0c;维护成本更小&#xff0c;所以深受各大公司的喜爱。 接口自动化包含2个部分&#xff0c;功能性的接口自动化测试和并发接口自动化测试。 本次文章着重介绍第一种&#xff0c…

python学习the sixth day

python函数进阶 一、函数多返回值 二、函数的多种参数使用 1.位置参数 2.关键字参数 3.缺省参数 设置默认值&#xff0c;必须放在最后面 4.不定长参数 4.总结 三、匿名函数 1.函数作为参数传递 这是计算逻辑的传递&#xff0c;而非数据的传递 2.lambda匿名函数 python文件操…

【vue.js】文档解读【day 3】 | 条件渲染

如果阅读有疑问的话&#xff0c;欢迎评论或私信&#xff01;&#xff01; 文章目录 条件渲染前言&#xff1a;v-ifv-elsev-else-iftemplate中的v-ifv-showv-if vs v-show 条件渲染 前言&#xff1a; 在JavaScript中&#xff0c;我们知道条件控制语句可以控制程序的走向&#…

ReactNative项目构建分析与思考之react-native-gradle-plugin

前一段时间由于业务需要&#xff0c;接触了下React Native相关的知识&#xff0c;以一个Android开发者的视角&#xff0c;对React Native 项目组织和构建流程有了一些粗浅的认识&#xff0c;同时也对RN混合开发项目如何搭建又了一点小小的思考。 RN环境搭建 RN文档提供了两种…

阿珊详解Vue Router的守卫机制

&#x1f90d; 前端开发工程师、技术日更博主、已过CET6 &#x1f368; 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 &#x1f560; 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 &#x1f35a; 蓝桥云课签约作者、上架课程《Vue.js 和 E…

用一个 Python 脚本实现依次运行其他多个带 argparse 命令行参数的 .py 文件

&#x1f349; CSDN 叶庭云&#xff1a;https://yetingyun.blog.csdn.net/ 问题描述&#xff1a;在 Windows 环境中&#xff0c;您希望通过一个 Python 脚本来实现特定的自动化任务&#xff0c;该任务需要依次运行其他多个带 argparse 命令行参数的 .py 文件。您希望找到一种简…

CXYGZL实现钉钉、飞书和微信全面覆盖!!!

非常欣慰能在这里与大家分享&#xff0c;CXYGZL已圆满实现多端互通的目标&#xff01;&#xff01;&#xff01; 无论您是在手机、电脑还是平板上使用钉钉、企微还是飞书&#xff0c;只需将CXYGZL轻松集成到您的办公软件中&#xff0c;即可实现无缝审批处理各项任务&#xff0c…

计算机找不到msvcr120.dll的五种修复方法,轻松搞定msvcr120.dll丢失问题

当计算机系统中msvcr120.dll文件丢失时&#xff0c;可能会引发一系列运行问题和故障现象。msvcr120.dll是Microsoft Visual C Redistributable Package的一部分&#xff0c;对于许多Windows应用程序的正常运行至关重要。由于msvcr120.dll是许多软件在运行过程中依赖的重要动态链…

Java项目:44 ssm003在线医疗服务系统+jsp(含文档)

作者主页&#xff1a;源码空间codegym 简介&#xff1a;Java领域优质创作者、Java项目、学习资料、技术互助 文中获取源码 项目介绍 主要功能 前台登录&#xff1a; 注册用户&#xff1a;用户名、密码、姓名、联系电话 注册医生&#xff1a;医生工号、密码、医生姓名、职称、…

idea:springboot项目搭建

目录 一、创建项目 1、File → New → Project 2、Spring Initializr → Next 3、填写信息 → Next 4、web → Spring Web → Next 5、填写信息 → Finish 6、处理配置不合理内容 7、注意事项 7.1 有依赖包&#xff0c;却显示找不到依赖&#xff0c;刷新一下maven 7.…

基于 HBase Phoenix 构建实时数仓(2)—— HBase 完全分布式安装

目录 一、开启 HDFS 机柜感知 1. 增加 core-site.xml 配置项 2. 创建机柜感知脚本 3. 创建机柜配置信息文件 4. 分发相关文件到其它节点 5. 重启 HDFS 使机柜感知生效 二、主机规划 三、安装配置 HBase 完全分布式集群 1. 在所有节点上配置环境变量 2. 解压、配置环境…

瑞_Redis_短信登录(一)

文章目录 项目介绍1 短信登录1.1 项目准备1.1.1 导入SQL1.1.2 导入后端项目1.1.3 导入前端项目 &#x1f64a; 前言&#xff1a;本文章为瑞_系列专栏之《Redis》的实战篇的短信登录章节的项目准备小节。由于博主是从B站黑马程序员的《Redis》学习其相关知识&#xff0c;所以本系…

2023年12月CCF-GESP编程能力等级认证Python编程七级真题解析

本文收录于专栏《Python等级认证CCF-GESP真题解析》,专栏总目录・点这里 一、单选题(每题 2 分,共 30 分) 第1题 假设变量 x 为 float 类型,如果下面代码输入为 100,输出最接近( )。 A.0 B.-5 C.-8 D.8 答案:B 第2题 对于下面动态规划方法实现的函数,以下选项中…

简单BFF架构设计

又到周五了有了一个小时的闲暇时间简单写点东西&#xff0c;介绍一个简单的BFF的架构。BFF:Backends For Frontends,其实现在是个比较常见的前端架构设计的方案&#xff0c;其最大的优势便在于前端可以高度自由的在Node层做一些server端才可以做的东西&#xff0c;比如SSR、登录…