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的能力,换个…...
shell脚本--常见案例
1、自动备份文件或目录 2、批量重命名文件 3、查找并删除指定名称的文件: 4、批量删除文件 5、查找并替换文件内容 6、批量创建文件 7、创建文件夹并移动文件 8、在文件夹中查找文件...
智慧工地云平台源码,基于微服务架构+Java+Spring Cloud +UniApp +MySql
智慧工地管理云平台系统,智慧工地全套源码,java版智慧工地源码,支持PC端、大屏端、移动端。 智慧工地聚焦建筑行业的市场需求,提供“平台网络终端”的整体解决方案,提供劳务管理、视频管理、智能监测、绿色施工、安全管…...
聊聊 Pulsar:Producer 源码解析
一、前言 Apache Pulsar 是一个企业级的开源分布式消息传递平台,以其高性能、可扩展性和存储计算分离架构在消息队列和流处理领域独树一帜。在 Pulsar 的核心架构中,Producer(生产者) 是连接客户端应用与消息队列的第一步。生产者…...
Qwen3-Embedding-0.6B深度解析:多语言语义检索的轻量级利器
第一章 引言:语义表示的新时代挑战与Qwen3的破局之路 1.1 文本嵌入的核心价值与技术演进 在人工智能领域,文本嵌入技术如同连接自然语言与机器理解的“神经突触”——它将人类语言转化为计算机可计算的语义向量,支撑着搜索引擎、推荐系统、…...
如何为服务器生成TLS证书
TLS(Transport Layer Security)证书是确保网络通信安全的重要手段,它通过加密技术保护传输的数据不被窃听和篡改。在服务器上配置TLS证书,可以使用户通过HTTPS协议安全地访问您的网站。本文将详细介绍如何在服务器上生成一个TLS证…...
Rust 异步编程
Rust 异步编程 引言 Rust 是一种系统编程语言,以其高性能、安全性以及零成本抽象而著称。在多核处理器成为主流的今天,异步编程成为了一种提高应用性能、优化资源利用的有效手段。本文将深入探讨 Rust 异步编程的核心概念、常用库以及最佳实践。 异步编程基础 什么是异步…...
服务器--宝塔命令
一、宝塔面板安装命令 ⚠️ 必须使用 root 用户 或 sudo 权限执行! sudo su - 1. CentOS 系统: yum install -y wget && wget -O install.sh http://download.bt.cn/install/install_6.0.sh && sh install.sh2. Ubuntu / Debian 系统…...
【Go语言基础【13】】函数、闭包、方法
文章目录 零、概述一、函数基础1、函数基础概念2、参数传递机制3、返回值特性3.1. 多返回值3.2. 命名返回值3.3. 错误处理 二、函数类型与高阶函数1. 函数类型定义2. 高阶函数(函数作为参数、返回值) 三、匿名函数与闭包1. 匿名函数(Lambda函…...
【笔记】WSL 中 Rust 安装与测试完整记录
#工作记录 WSL 中 Rust 安装与测试完整记录 1. 运行环境 系统:Ubuntu 24.04 LTS (WSL2)架构:x86_64 (GNU/Linux)Rust 版本:rustc 1.87.0 (2025-05-09)Cargo 版本:cargo 1.87.0 (2025-05-06) 2. 安装 Rust 2.1 使用 Rust 官方安…...
搭建DNS域名解析服务器(正向解析资源文件)
正向解析资源文件 1)准备工作 服务端及客户端都关闭安全软件 [rootlocalhost ~]# systemctl stop firewalld [rootlocalhost ~]# setenforce 0 2)服务端安装软件:bind 1.配置yum源 [rootlocalhost ~]# cat /etc/yum.repos.d/base.repo [Base…...
