C++ ——继承
体现的是代码复用的思想
1、子类继承父类,子类就拥有了父类的特性(成员方法和成员属性)
2、已存在的类被称为“基类”或者“父类”或者“超类”;新创建的类被称为“派生类”或者“子类”
注意:
(1)子类继承了父类,子类就拥有了父类的属性和方法
(2)如果子类重写了父类的同名方法,子类对象默认调用的是子类自己的成员方法,如果想调用父类的同名方法,要添加父类作用域限定符
#include <iostream>using namespace std;class Father{public:int num1=88;int num2=99;public://成员方法void show()const{cout<<"num1="<<num1<<",num2="<<num2<<endl;}void cook(){cout<<"做水煮鱼"<<endl;}};class Son:public Father{ //public:放在继承的地方,表示继承方式是公有继承public:void sing(){cout<<"唱歌"<<endl;}void cook(){cout<<"做红烧肉"<<endl;}};int main(){Son s1;s1.cook(); //默认子类调用的是自己的成员方法s1.show();s1.sing();s1.Father::cook(); //子类可以使用添加父类作用域限定符,来调用父类的同名方法return 0;}
1、构造函数
1.1 派生类的构造函数
继承中的无参构造函数
(1)基类(父类)中的构造函数不能被继承
(2)派生类(子类)中必须要调用基类中的构造函数来完成属性的初始化
(3)默认情况下,编译器会自动在派生类中调用父类的无参构造函数
(4)子类继承了父类,子类独有的属性需要在自己的构造函数进行初始化,而子类从父类继承过来的属性,必须通过子类构造函数调用父类构造函数进行初始化
#include <iostream>using namespace std;class Father{public:int num1=88;int num2=99;public://编译器默认的无参构造函数Father(){}//有参构造函数Father(int num1,int num2):num1(num1),num2(num2){}};class Son:public Father{ //public:放在继承的地方,表示继承方式是公有继承public:int a;public://编译器默认的子类无参调用父类无参构造函数Son():Father(){}//子类有参构造函数调用父类有参构造函数,来完成继承下来的属性的初始化Son(int num1,int num2,int a):Father(num1,num2),a(a){}};int main(){Son s2(10,55,66);// s2.show();cout<<s2.a<<endl; //66return 0;}
1.2 派生类调用基类构造函数
(1)目的:因为构造函数和析构函数,不能继承,所以派生类的构造函数通过调用基类的构造函数完成部分属性的初始化
(2)派生类的构造函数调用基类的构造函数的方式:透传构造、委托构造、继承构造
1.2.1 透传构造
派生类的构造函数直接调用基类的构造函数
class Father{public:int num;public://无参构造函数---->委托构造Father():Father(90){}//有参构造函数Father(int num):num(num){}};class Son:public Father{ //public:放在继承的地方,表示继承方式是公有继承public:int num1;public://委托构造Son():Son(2,88){}//透传构造Son(int num1,int num):Father(num),num1(num1){}};
1.2.2 委托构造
可维护性好,但效率相对较低
思想:一个类中的构造函数是可以调用这个类中的其他构造函数
父类的无参构造函数调用父类的有参构造函数;子类的无参构造函数调用子类的有参构造函数;子类的有参构造函数透传父类的有参构造函数
注意:委托构造离不开透传构造
class Father{public:int num;public://无参构造函数---->委托构造Father():Father(90){}//有参构造函数Father(int num):num(num){}};class Son:public Father{ //public:放在继承的地方,表示继承方式是公有继承public:int num1;public://委托构造Son():Son(2,88){}//透传构造Son(int num1,int num):Father(num),num1(num1){}};
1.2.3 继承构造
透传构造的简写方式,一句话自动实现透传构造,编译器会自动给派生类添加n个构造函数(n取决于基类中构造函数的个数),并实现自动透传其基类构造函数
class Father{public:int num;int age;string addr;public://无参构造函数---->委托构造Father():Father(90){}//有参构造函数Father(int num):num(num){}Father(int age,string addr):age(age),addr(addr){}};class Son:public Father{ //public:放在继承的地方,表示继承方式是公有继承public:int num1=99;public://继承构造using Father::Father;};
2、对象的构建和销毁的过程
(1)成员对象:类中有一个成员,该成员是对象类型,叫做对象成员
先调用成员对象的构造函数,再调用自己的构造函数;析构函数则相反
(2)父子类继承时
先调用父类的构造函数,再调用子类的构造函数;析构函数则相反
(3)静态成员对象:类中有一个静态成员,该成员是一个对象类型
静态成员对象的构造函数先执行,再执行自己的构造函数;析构函数则相反
顺序:
构造函数:静态成员对象---->成员对象---->父类---->子类
析构函数:子类---->父类---->成员对象---->静态成员对象
2.1 成员对象
class Demon{public://构造函数Demon(){cout<<"成员对象的构造函数"<<endl;}~Demon(){cout<<"成员对象的析构函数"<<endl;}};class Test{public:Test(){cout<<"构造函数"<<endl;}~Test(){cout<<"析构函数"<<endl;}};
2.2 父子类继承时
class Father{public:Father(){cout<<"父类构造"<<endl;}~Father(){cout<<"父类析构"<<endl;}};class Son:public Father{public:Son():Father(){cout<<"子类构造"<<endl;}~Son(){cout<<"子类析构"<<endl;}};
2.3 静态成员对象
class P{public:P(){cout<<"静态成员对象的构造"<<endl;}~P(){cout<<"静态成员对象的析构"<<endl;}};class Phone{public://类内声明static P p1; //静态成员变量的声明Phone(){cout<<"构造函数"<<endl;}~Phone(){cout<<"析构函数"<<endl;}};P Phone::p1=P(); //类外初始化
3、权限
3.1 权限修饰符
C++中成员的权限修饰符有3种:
(1)public:共有的 类内、子类内、类外可以访问
(2)private:私有的 只能类内访问
(3)protected:受保护的 类内、子类内可以访问
注意:如果权限修饰符可以省略,默认是private
#include <iostream>using namespace std;class Father{public:int num1;private:int num2;protected:int num3;public://构造函数Father(int num1,int num2,int num3):num1(num1),num2(num2),num3(num3){}void show()const{cout<<this->num1<<" "; //public 类内可以访问cout<<this->num2<<" "; //private 类内可以访问cout<<this->num3<<" "; //protected 类内可以访问cout<<"*******"<<endl;}};class Son:public Father{public:using Father::Father;void fun()const{cout<<this->num1<<" "<<this->Father::num1<<" "; //public 子类内可以访问cout<<this->num3<<" "<<this->Father::num3<<" "; //protected 子类内可以访问cout<<"*******"<<endl;}};int main(){Father f1(1,2,3);f1.show();Son s1(4,5,6);s1.fun();cout<<s1.num1<<endl; //public 类外可以访问return 0;}
3.2 继承方式
3.2.1 public(共有继承)
(1)父类是public---->子类也是public
(2)父类是protected---->子类也是protected
(3)父类是private---->子类也是private,但是类内不可以直接访问,可以间接访问
#include <iostream>using namespace std;class Father{public:int num1;protected:int num2;private:int num3;public:Father(int num1,int num2,int num3):num1(num1),num2(num2),num3(num3){}void fun()const{}int get_num3()const{return num3;}};class Son:public Father{public:Son(int num1,int num2,int num3):Father(num1,num2,num3){}void show(){cout<<this->num1<<endl; //父类public---->子类也是public,类内可以访问cout<<this->num2<<endl; //父类protected---->子类也是protected// cout<<this->num3<<endl; //报错,父类private---->子类也是private,但是类内不可以直接访问cout<<this->Father::get_num3()<<endl; //父类private---->子类也是private,可以间接访问cout<<"******"<<endl;}};class Sunzi:public Son{public:Sunzi(int num1,int num2,int num3):Son(num1,num2,num3){}void fun()const{cout<<this->num1<<" "<<this->Son::num1<<endl; //父类public---->子类也是public,派生类内可以访问cout<<this->num2<<" "<<this->Son::num2<<endl; //父类protected---->子类也是protectedcout<<"******"<<endl;}};int main(){Son s1(1,2,3);s1.show();cout<<s1.num1<<endl; //父类public---->子类也是public,类外可以访问Sunzi sz(4,5,6);sz.fun();return 0;}
3.2.2 protected(受保护的继承)
(1)父类是public---->子类是protected
(2)父类是protected---->子类也是protected
(3)父类是private---->子类也是private,但是类内不可以直接访问,可以间接访问
#include <iostream>using namespace std;class Father{public:int num1;protected:int num2;private:int num3;public:Father(int num1,int num2,int num3):num1(num1),num2(num2),num3(num3){}void fun()const{}int get_num3()const{return num3;}};class Son:protected Father{public:Son(int num1,int num2,int num3):Father(num1,num2,num3){}void show(){cout<<this->num1<<endl; //父类public---->子类是protectedcout<<this->num2<<endl; //父类protected---->子类也是protected// cout<<this->num3<<endl; //报错,父类private---->子类也是private,但是类内不可以直接访问cout<<this->Father::get_num3()<<endl; //父类private---->子类也是private,可以间接访问cout<<"******"<<endl;}};class Sunzi:protected Son{public:Sunzi(int num1,int num2,int num3):Son(num1,num2,num3){}void fun()const{cout<<this->num1<<" "<<this->Son::num1<<endl; //父类public---->子类是protectedcout<<this->num2<<" "<<this->Son::num2<<endl; //父类protected---->子类也是protectedcout<<"******"<<endl;}};int main(){Son s1(1,2,3);s1.show();Sunzi sz(4,5,6);sz.fun();return 0;}
3.2.3 private(私有继承)
(1)父类是public---->子类是private,类内可以直接访问
(2)父类是protected---->子类是private,类内可以直接访问
(3)父类是private---->子类也是private,但是类内不可以直接访问,可以间接访问
4、多重继承
4.1 概念
继承中,允许有多个基类,每一个基类的继承都可以看作是唯一的独一继承,此时派生类就拥有了所有基类的特性
#include <iostream>using namespace std;class Sofa{public:int num=1;public:void job(){cout<<"沙发可以坐"<<endl;}};class Bed{public:void work(){cout<<"床可以躺"<<endl;}};class SofsBed:public Sofa,public Bed{public:void work(){cout<<"即可以躺又可以坐"<<endl;}};int main(){SofsBed sfb;sfb.job();sfb.work();cout<<sfb.num<<endl;sfb.Bed::work();return 0;}
问题:多个基类同时拥有同名成员函数,此时派生类对象直接调用该函数会产生歧义
解决方法:添加基类作用域限定符
4.2 菱形继承
多继承中的若干个基类,又同时拥有同一个基类,此时叫菱形继承(钻石继承)
#include <iostream>using namespace std;//爷爷类class Furniture{public:void show(){cout<<"我们是家具"<<endl;}};//基类class Sofa:virtual public Furniture{};class Bed:virtual public Furniture{};//派生类class SofsBed:public Sofa,public Bed{};int main(){SofsBed sfb;// sfb.show(); //报错,问题:两个基类拥有了同名函数,产生了歧义//解决方法1:使用基类作用域限定符sfb.Bed::show();sfb.Sofa::show();//解决方法2:使用虚继承/*继承方式有两种:普通继承(默认的)和虚继承(继承方式前添加virtual关键字)*/sfb.show();return 0;}
相关文章:
C++ ——继承
体现的是代码复用的思想 1、子类继承父类,子类就拥有了父类的特性(成员方法和成员属性) 2、已存在的类被称为“基类”或者“父类”或者“超类”;新创建的类被称为“派生类”或者“子类” 注意: (1&#…...
LeetCode 热题 100 283. 移动零
LeetCode 热题 100 | 283. 移动零 大家好,今天我们来解决一道经典的算法题——移动零。这道题在LeetCode上被标记为简单难度,要求我们将数组中的所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。下面我将详细讲解解题思路,…...
游戏引擎学习第116天
回顾昨天的工作 本次工作内容主要集中在游戏开发的低级编程优化,尤其是手动优化软件渲染。工作目的之一是鼓励开发者避免依赖外部库,而是深入理解代码并进行优化。当前阶段正进行SIMD(单指令多数据)优化,使用Intel推荐…...
react(9)-redux
使用CRA快速创建react项目 npx create-react-app react-redux 安装配套工具 npm i reduxjs/toolkit react-redux 启动项目 在创建项目时候会出现一个问题 You are running create-react-app 5.0.0, which is behind the latest release (5.0.1). We no longer support…...
Linux内核实时机制7 - 实时改造机理 - 软中断优化下
Linux内核实时机制7 - 实时改造机理 - 软中断优化下 https://blog.csdn.net/u010971180/article/details/145722641以下分别以Linux4.19、Linux5.4、Linux5.10、Linux5.15 展开分析,深入社区实时改造机理的软中断优化过程。https://blog.csdn.net/weixin_41028621/article/det…...
企业知识管理平台重构数字时代知识体系与智能服务网络
内容概要 现代企业知识管理平台的演进呈现出全生命周期管理与智能服务网络构建的双重特征。通过四库体系(知识采集库、加工库、应用库、评估库)的协同运作,该系统实现了从知识沉淀、结构化处理到价值释放的完整闭环。其中,知识图…...
大数据组件(四)快速入门实时数据湖存储系统Apache Paimon(3)
Paimon的下载及安装,并且了解了主键表的引擎以及changelog-producer的含义参考: 大数据组件(四)快速入门实时数据湖存储系统Apache Paimon(1) 利用Paimon表做lookup join,集成mysql cdc等参考: 大数据组件(四)快速入门实时数据…...
SVN把英文换中文
原文链接:SVN设置成中文版本 都是英文,换中文 Tortoise SVN 安装汉化教程(乌龟SVN) https://pan.quark.cn/s/cb6f2eee3f90 下载中文包...
Ubuntu 的RabbitMQ安装
目录 1.安装Erlang 查看erlang版本 退出命令 2. 安装 RabbitMQ 3.确认安装结果 4.安装RabbitMQ管理界面 5.启动服务并访问 1.启动服务 2.查看服务状态 3.通过IP:port 访问界面 4.添加管理员用户 a)添加用户名:admin,密码࿱…...
基于WebRTC与AI大模型接入EasyRTC:打造轻量级、高实时、强互动的嵌入式音视频解决方案
随着物联网和嵌入式技术的快速发展,嵌入式设备对实时音视频通信的需求日益增长。然而,传统的音视频解决方案往往存在体积庞大、实时性差、互动体验不佳等问题,难以满足嵌入式设备的资源限制和应用场景需求。 针对以上痛点,本文将介…...
QML 实现一个动态的启动界面
QML 实现一个动态的启动界面 一、效果查看二、源码分享三、所用到的资源下载 一、效果查看 二、源码分享 工程结构 main.qml import QtQuick import QtQuick.Controls import QtQuick.Dialogs import Qt.labs.platformWindow {id:windowwidth: 640height: 400visible: truetit…...
智能预警系统标准化处理流程
在当今数字化时代,IT系统的稳定运行对企业的业务连续性至关重要。为了及时发现和响应系统异常,构建智能预警系统已成为许多企业的当务之急。但仅仅拥有预警系统还不够,我们还需要一套标准化的处理流程,确保问题能够高效、有序地得到解决。 © ivwdcwso (ID: u012172506) 一…...
Unity游戏制作中的C#基础(4)数组声明和使用
一、数组的声明 在 C# 中,声明数组有多种方式,每种方式都有其适用的场景,下面为你逐一详细介绍: 1. 直接初始化声明 这种方式直观且便捷,在声明数组的同时就为其赋初值,让数组从诞生之初就拥有了具体的数据…...
tailwindcss学习03
01 入门 02 vue中接入 03 工具类优先 准备 vue.svg <svg viewBox"0 0 40 40" xmlns"http://www.w3.org/2000/svg"> <defs> <linearGradient x1"50%" y1"0%" x2"50%" y2"100%" id"a"&…...
QML Component 与 Loader 结合动态加载组件
在实际项目中,有时候我们写好一个组件,但不是立即加载出来,而是触发某些条件后才动态的加载显示出来,当处理完某些操作后,再次将其关闭掉; 这样的需求,可以使用 Component 包裹着组件ÿ…...
Visual studio 2022 将打开文件的方式由单击改为双击
1. 打开vs2022,选择Tools -> Options打开Options设置页面 2. 在左侧依次展开Environment, 选择Tabs and Windows 3. 在右侧面板往下拖拽滚动条,找到Preview Tab section, unchecked "Preview selected files in Solution Explorer (Altclick t…...
网络工程师 (49)UDP协议
前言 UDP协议,即用户数据报协议(User Datagram Protocol),是一种无连接的、不可靠的、面向报文的传输层通信协议。 一、基本特点 无连接性:UDP在发送数据之前不需要与目标设备建立连接,也无需在数据发送结束…...
了解大数据
一、大数据的特点: 1.大量 2.高速 3.多样 结构化数据和非结构化数据 4.低价值密度 二、大数据的应用场景:视频推荐、电商推荐等 三、大数据的技术发展脉络 阶段1:单机时代 阶段2:大数据时代-分布式处理 阶段3:实…...
命令模式
1. 命令模式简介 命令模式(Command Pattern)是一种行为型设计模式,它将一个请求封装为一个对象,从而使您可以用不同的请求对客户进行参数化、对请求排队或记录请求日志,以及支持可撤销的操作。命令模式的核心思想是将操作和操作的执行者解耦,使得操作可以独立于执行者进…...
解放大脑!用DeepSeek自动生成PPT!
DeepSeek应用(PPT篇) DeepSeek作为当前最好的AI大模型之一,其强大的文本生成能力被广泛的应用于各个领域,本文我们来聊聊用DeepSeek来自动生成PPT。 一、DeepSeek & PPT DeepSeek本身没有直接生成PPT的能力,换个…...
线程与协程
1. 线程与协程 1.1. “函数调用级别”的切换、上下文切换 1. 函数调用级别的切换 “函数调用级别的切换”是指:像函数调用/返回一样轻量地完成任务切换。 举例说明: 当你在程序中写一个函数调用: funcA() 然后 funcA 执行完后返回&…...
UDP(Echoserver)
网络命令 Ping 命令 检测网络是否连通 使用方法: ping -c 次数 网址ping -c 3 www.baidu.comnetstat 命令 netstat 是一个用来查看网络状态的重要工具. 语法:netstat [选项] 功能:查看网络状态 常用选项: n 拒绝显示别名&#…...
【第二十一章 SDIO接口(SDIO)】
第二十一章 SDIO接口 目录 第二十一章 SDIO接口(SDIO) 1 SDIO 主要功能 2 SDIO 总线拓扑 3 SDIO 功能描述 3.1 SDIO 适配器 3.2 SDIOAHB 接口 4 卡功能描述 4.1 卡识别模式 4.2 卡复位 4.3 操作电压范围确认 4.4 卡识别过程 4.5 写数据块 4.6 读数据块 4.7 数据流…...
2021-03-15 iview一些问题
1.iview 在使用tree组件时,发现没有set类的方法,只有get,那么要改变tree值,只能遍历treeData,递归修改treeData的checked,发现无法更改,原因在于check模式下,子元素的勾选状态跟父节…...
NFT模式:数字资产确权与链游经济系统构建
NFT模式:数字资产确权与链游经济系统构建 ——从技术架构到可持续生态的范式革命 一、确权技术革新:构建可信数字资产基石 1. 区块链底层架构的进化 跨链互操作协议:基于LayerZero协议实现以太坊、Solana等公链资产互通,通过零知…...
return this;返回的是谁
一个审批系统的示例来演示责任链模式的实现。假设公司需要处理不同金额的采购申请,不同级别的经理有不同的审批权限: // 抽象处理者:审批者 abstract class Approver {protected Approver successor; // 下一个处理者// 设置下一个处理者pub…...
在鸿蒙HarmonyOS 5中使用DevEco Studio实现企业微信功能
1. 开发环境准备 安装DevEco Studio 3.1: 从华为开发者官网下载最新版DevEco Studio安装HarmonyOS 5.0 SDK 项目配置: // module.json5 {"module": {"requestPermissions": [{"name": "ohos.permis…...
Golang——7、包与接口详解
包与接口详解 1、Golang包详解1.1、Golang中包的定义和介绍1.2、Golang包管理工具go mod1.3、Golang中自定义包1.4、Golang中使用第三包1.5、init函数 2、接口详解2.1、接口的定义2.2、空接口2.3、类型断言2.4、结构体值接收者和指针接收者实现接口的区别2.5、一个结构体实现多…...
LangFlow技术架构分析
🔧 LangFlow 的可视化技术栈 前端节点编辑器 底层框架:基于 (一个现代化的 React 节点绘图库) 功能: 拖拽式构建 LangGraph 状态机 实时连线定义节点依赖关系 可视化调试循环和分支逻辑 与 LangGraph 的深…...
【Linux手册】探秘系统世界:从用户交互到硬件底层的全链路工作之旅
目录 前言 操作系统与驱动程序 是什么,为什么 怎么做 system call 用户操作接口 总结 前言 日常生活中,我们在使用电子设备时,我们所输入执行的每一条指令最终大多都会作用到硬件上,比如下载一款软件最终会下载到硬盘上&am…...
