当前位置: 首页 > news >正文

C++07(继承)

文章目录

    • 面向对象之继承
      • 继承相关概念
      • 派⽣类声明
      • 派⽣类的成员访问属性
      • 派⽣类的构造函数与析构函数
    • 面向对象编程
      • 编程思想
      • 面向对象编程涉及到两个重要的概念
      • 类类型的定义
      • **类中数据成员的定义**
      • 构建对象
      • 成员访问
      • 成员访问修饰符——限制成员的可见性
      • 构造函数
      • 析构函数
      • 静态成员
      • 共用数据的保护
      • 友元
      • 嵌套类

面向对象之继承

在C++中可重⽤性是通过继承(inheritance)这⼀机制来实现的。继承是C++的⼀个重要组成部分。

继承相关概念

继承:

在C++中,“继承”是类之间定义的⼀种重要的关系,就是在⼀个已存在的类的基础上建⽴⼀个新的类。

⽗类:被继承的类称为⽗类或基类,基类的基类或更⾼层次的基类称为间接基类。

⼦类:继承的类称为⼦类或派⽣类

  • ⼀个B类继承A类或从A类派⽣B类,其中A类称为⽗类(基类),B类称为⼦类(派⽣类);

  • 派⽣类成员是除了从基类继承来的所有成员之外,还包含新增加的数据和函数成员。

  • 默认情况下派⽣类包含了全部基类函数中除构造函数和析构函数之外的所有成员,⼀般来说构造函数和析构函数是不能继承的,但是C++11规定可以⽤using语句继承基类构造函数。

  • 继承是保留利⽤原有的类的功能,⽽派⽣是添加新的成员和功能。

多继承与单继承:

⼀个派⽣类,可以同时有多个基类,这种情况称为多继承。

⼀个派⽣类只有⼀个直接基类的情况称为单继承。

注意: c++也⽀持多继承,能⽤单继承解决,尽量使⽤单继承解决

派⽣类声明

1、派⽣类的语法定义:

class 子类名:访问控制 父类1,访问控制 父类2....
{类体
}

冒号后⾯的被称为基类名表,基类名表的构成: 访问控制+基类名;

访问控制表示派⽣类对基类的继承⽅式,使⽤关键字public ,private,protected,如果不写默认为private。

派⽣类经历的三个步骤:

  • 吸收基类成员

  • 改造基类成员

  • 添加新的成员
    在这里插入图片描述
    继承示例:

class father
{private:string name;public:father(){ cout << "我是⽗类中的构造函数" << endl; }void show(){cout << "我是类中的普通成员函数" << endl;}
};
// 声明⼀个派⽣类
class son :public father
{
public:int a;//新增的数据成员void test() //新增的成员函数{cout << "我是⼦类中的成员函数" << endl;}
};
int main()
{son per1;per1.show(); //.调⽤继承过来的⽗类成员per1.test(); //.调⽤⼦类的新增成员
}
//继承可以理解为⼀个类从另⼀个类获取⽅法(函数)和属性(成员变量)的过程

派⽣类的成员访问属性

派⽣类中包含基类成员和派⽣类⾃⼰增加的成员,就产⽣了这两部分成员的关系和访问属性的问题 ,实际上,对基类成员和派⽣类⾃⼰增加的成员是按不同的原则处理的,访问的原则主要通过继承⽅式来体现的。

●公有继承

⽗类成员在⼦类中保存原有的访问属性

● 私有继承

⽗类成员在⼦类中成为私有成员,⽗类的公有成员和受保护成员可以在派⽣类中内部使⽤,⽗类的私有成员在⼦类内⽆法访问。

● 保护继承

基类的public和protected成员:都以protected身份出现在派⽣类中;基类的private成员:不可在派⽣类内部直接访问

派⽣类的构造函数与析构函数

派⽣类构造函数声明与定义:

由于⼦类不能继承⽗类的构造⽅法,因此在创建⼦类对象时,为了初始化从⽗类继承来的数据成员,系统需要调⽤其⽗类的构造⽅法,如果继承多个基类,需要 给多个基类传递参数时,派生类对象在创建时,先调用父类的构造函数派⽣类的构造函数语法格式为:

派生类类名::派生类名(参数表):基类1(基类1初始化),基类2(基类1初始化),子对象(初始化列表)..
{本类成员初始化赋值语句;
}

派⽣类在实例化的时候 先调⽤⽗类的构造函数,然后再调⽤⾃⼰的构造函数,如果定义⼀个类,最好写⼀个默认构造函数。

● 对派⽣类构造函数作声明时,不包括基类构造函数名及其参数表列, 只在定义函数时才将它列出。

● 派⽣类构造函数执⾏的次序:参数初始化表先对基类初始化,再对⼦对象初始化,最后对⾃⼰的数据成员初始化。

调⽤基类构造函数,调⽤顺序按照它们被继承时声明的顺序(从左到右);

调⽤内嵌成员对象的构造函数,调⽤顺序按照它们在类中声明的顺序;

派⽣类析构函数:

派⽣时,派⽣类是不能继承基类的析构函数的,也需要通过派⽣类的析构函数去调⽤基类的析构函数。在派⽣类中可以根据需要定义⾃⼰的析构函数,⽤来对派⽣类中所增加的成员进⾏清理⼯作。

调⽤的顺序与构造函数正好相反: 先执⾏派⽣类⾃⼰的析构函数,对派⽣类新增加的成员进⾏清理,然后调⽤⼦对象的析构函数,对⼦对象进⾏清理,最后调⽤基类的析构函数,对基类进⾏清理 。

面向对象编程

编程思想

定义:对现实世界问题在程序世界进行建模方法

编程思想主要分为:面向过程编程pop、面向对象编程oop

面向过程编程特点:

它的核心主要讲究“怎么做”,将问题拆分为一个个的流程,然后将每个流程封装成函数最后再按照业务的流程来分别调用函数,实现最终问题的解决。不注重职责分工,适合解决小规模问题。

面向对象编程:

它的核心讲究“谁来做”,将待解决问题中涉及到的角色先进行构建并进行分装,再按照业务流程分别调用不同角色中的方法来实现问题的解决。注重职责分工,适合解决中大规模的问题。

面向对象编程涉及到两个重要的概念

类class:一类事物的抽象描述(共有属性和行为的集合)

对象object:某种类型的具体存在(由类构建的具体实例),类是构建对象的模板,一个类可以构建多个对象

类类型的定义

类类型和结构体类型是C++提供给程序员进行自定义类型的两种手段

类类型是在结构体的基础上做发展起来的一个类型,是结构体的加强版

class 类型名
{类体(数据成员+函数成员+访问范围修饰符)
};数据成员-----主要来描述事物的特征
函数成员-----主要用来描述事物的行为
访问范围修饰符:设置某个成员的可见性,如果省略,默认是私有成员

类中数据成员的定义

数据成员:格式: 数据类型 成员名;

数据成员分类:

普通数据成员 int a;通过构造函数实现初始化

常数据成员 const int a;通过构造函数的初始化列表初始化

静态数据成员 static int a;类外初始化 int stu::a=100

函数成员: 格式:

类内 : 返回类型 函数名([形参列表])——类内定义系统会认为是内置函数

​ {

​ }

类外定义: 类内声明 返回类型 函数名([形参列表]);

​ 返回类型 类名::函数名([形参列表])

​ {

​ }

函数成员分类:

普通函数成员: int test(){}

特殊函数成员:构造函数,拷贝构造函数,析构函数

常函数成员: int test([形参列表]) const {}

静态函数成员: static int test([形参列表])

虚函数成员:virtual int test([形参列表])

运算符重载函数成员:int operator+(){}

友元函数:friend int test([形参列表]){}

构建对象

栈上构建对象:

[class] 类名 对象列表;//class 关键字可以省略

构建单个对象: stu s1;

构建对象数组: stu arr[10];

销毁方式:自动销毁

堆上构建对象:

类名 指针名 = new 类名[(实参列表)];

构建单个对象:new stu;

构建对象数组:new stu[size];

销毁方式:delete 对象指针名,delete [] 对象指针名

匿名对象:类名([实参列表])

成员访问

类外:

数据成员访问:

对象名.数据成员名;

函数成员:

对象名.成员函数名([实参列表]);

类内:

数据成员访问:数据成员名或this->数据成员;

函数成员:成员函数名([实参列表])

特殊情况:数据成员只有类型没有成员名

类名::类型名 对象列表;

成员访问修饰符——限制成员的可见性

public:设置公有成员的访问属性,类内和类外都可以对其进行访问

protected:设置受保护的访问属性,类内和该类的派生类内部可以对其进行访问

private:设置私有的访问属性

构造函数

作用:初始化类中的数据成员,它也可以调用类中其他成员函数。

特点:函数名必须和当前的类名要一样;没有返回类型;不需要用户主动调用;

构造函数也可以被重载

分类:

​ 普通构造函数:创建对象时自动触发

​ 默认构造函数:没有形参的构造函数或有形参且每个形参都提供默认值

​ 拷贝构造函数:只有一个形参且该形参必须是当前的类类型

​ 移动构造函数

​ 转型构造函数

初始化列表依附于构造函数才有意义

格式:

​ 函数名([形参列表]):对象1(值1),对象2(值2),…,对象n(值n)

​ {

​ }

小括号的值可以是一个某个常量也可以来自构造函数进行的某个形参

拷贝构造函数——设置对象间的拷贝原则

格式:类名(const 类名&形参)

​ {

​ }

触发场景:

用一个对象初始化另一个对象 stu s1(s2) stu s1=s2;

用对象当做值传递

函数在返回某个对象时

应用场景:当类中存在指针数据成员且该数据成员指向一个堆内存

析构函数

作用:清理收尾工作或销毁对象

特点:函数名必须是~+类名;没有返回类型;没有形参;不需要用户主动调用,如果用户没有提供,系统会自动生成

触发时机:当对象离开了它的域或对一个堆对象施加delete

静态成员

作用:减少内存占用,从而提供程序的指向效率。

静态数据成员:static int a;

特点:静态成员属于类,在内存中只占一份,可以供该类创建的所有对象所共享

静态成员可以被该类的对象所调用,也可以直接通过类名去调用

在静态成员函数中不能调用类中的非静态成员

在类中的非静态成员函数中可以调用类中的静态成员

静态成员函数可以调用静态成员

静态数据成员必须在类外先初始化然后才能使用

静态函数成员:static int test(){}

共用数据的保护

作用:让类中的数据既呈现了一定的开放性,同时又对用户使用时做出了限制

const修饰的三个层:

  • const修饰对象:const stu s1;
  • const修饰函数成员:void test() const{}
  • const修饰数据成员:const int a;

友元

作用:通过友元,可以实现将某个类中的私有成员可以实现访问

缺点:破坏类的封装性

友元函数:需要先在类中声明 friend int test(形参1,…){}

在类外实现,它不是类的真正成员(不可以通过类对象对其进行访问)

友元类:声明友元类 friend class 类;

嵌套类

在C++中,可以在类内定义另外一个类类型

相关文章:

C++07(继承)

文章目录 面向对象之继承继承相关概念派⽣类声明派⽣类的成员访问属性派⽣类的构造函数与析构函数 面向对象编程编程思想面向对象编程涉及到两个重要的概念类类型的定义**类中数据成员的定义**构建对象成员访问成员访问修饰符——限制成员的可见性构造函数析构函数静态成员共用…...

文件上传漏洞:upload-labs靶场1-10

目录 文件上传漏洞介绍 定义 产生原因 常见危害 漏洞利用方式 upload-labs详解 pass-01 pass-02 pass-03 pass-04 pass-05 pass-06 pass-07 pass-08 pass-09 pass-10 文件上传漏洞介绍 定义 文件上传漏洞是指网络应用程序在处理用户上传文件时&#xff0c;没有…...

【Python/Pytorch】-- 创建3090Ti显卡所需环境

文章目录 文章目录 01 服务器上&#xff0c;存在三个anaconda&#xff0c;如何选择合适的&#xff0c;创建python环境&#xff1f;02 conda、anaconda、cuda、cudnn区别03 用到一些指令04 如何指定cuda的版本&#xff1f;05 conda跟pip的区别&#xff1f;06 pycharm控制台07 服…...

自然语言转SQL之Vanna.ai:AI集成数据库

自然语言转SQL之Vanna.ai&#xff1a;AI集成数据库 一、Vanna.ai是什么二、落地步骤&#xff1a;实现三层需求2.1 官方示例看效果2.2 对接自己的数据库2.3 完全本地化之路 三、构建自己的产品3.1 提问转SQL3.2 执行SQL查询实例2 要实现的功能就是&#xff1a;用中文语言同数据库…...

【零基础到精通Java合集】第二十二集:CMS收集器详解(低延迟的里程碑)

课程标题:CMS收集器详解——低延迟垃圾回收的经典实现(15分钟) 目标:掌握CMS核心工作原理、适用场景与调优策略,理解其在高并发场景下的价值与局限性 0-1分钟:课程引入与CMS设计目标 以“高速公路不停车收费”类比CMS核心思想:在用户线程运行的同时并发回收垃圾,最大…...

2025-03-04 学习记录--C/C++-PTA 习题5-5 使用函数统计指定数字的个数

合抱之木&#xff0c;生于毫末&#xff1b;九层之台&#xff0c;起于累土&#xff1b;千里之行&#xff0c;始于足下。&#x1f4aa;&#x1f3fb; 一、题目描述 ⭐️ 二、代码&#xff08;C语言&#xff09;⭐️ #include <stdio.h>int CountDigit( int number, int di…...

SP导入模型设置

法线贴图格式 Blender,Unity选择OpenGL UE,3DMax选择DirectX...

计算机网络——IP地址

一、IP地址是什么&#xff1f; 定义 IP地址是互联网协议&#xff08;Internet Protocol&#xff09;为每台联网设备分配的唯一标识符&#xff0c;由一串数字&#xff08;IPv4&#xff09;或字母与数字组合&#xff08;IPv6&#xff09;构成。 核心作用&#xff1a;定位设备位置…...

openharmony 软总线-设备发现流程

6.1 设备发现流程 6.1.1 Wi-Fi设备发现 6.1.1.1 Wi-Fi设备发现流程 Wi-Fi设备在出厂状态或者恢复出厂状态下&#xff0c;设备上电默认开启SoftAP模式&#xff0c;SoftAP的工作信道在1&#xff0c;6&#xff0c;11中随机选择&#xff0c;SoftAP的Beacon消息中携带的SSID eleme…...

零信任架构和传统网络安全模式的

零信任到底是一个什么类型的模型&#xff1f;什么类型的思想或思路&#xff0c;它是如何实现的&#xff0c;我们要做零信任&#xff0c;需要考虑哪些问题&#xff1f; 零信任最早是约翰金德瓦格提出的安全模型。早期这个模型也是因为在安全研究上考虑的一个新的信任式模型。他最…...

TCP/IP四层模型:从入门到精通

第一部分&#xff1a;基础概念 1.1 什么是TCP/IP&#xff1f; - TCP/IP 是互联网的基础通信协议簇&#xff0c;定义了数据如何在网络中传输和路由。 - 与OSI七层模型的对比&#xff1a;TCP/IP更简化&#xff0c;分为四层&#xff0c;注重实际应用。 1.2 四层模型结构 1. 应…...

二、QT和驱动模块实现智能家居-----问题汇总1

1、文件地址改变后必须在QT下更改地址 2、指定了QT内Kits下的Sysroot头文件地址&#xff0c;但是还是找不到头文件&#xff1a; 3、提示无法执行QT程序&#xff1a;先干掉之前的QT程序 ps //查看程序PIDkill -9 PID 4、无法执行QT程序 1&#xff09;未设置环境变量 …...

10、HTTP/3有了解过吗?【中高频】

HTTP/2 虽然具有多个流并发传输的能力&#xff0c;但是传输层是 TCP 协议&#xff0c;依然存在缺陷&#xff1a; 队头阻塞&#xff0c;HTTP/2 是基于 TCP 协议来传输数据的&#xff0c;TCP 是字节流协议&#xff0c;TCP 层必须保证收到的字节数据是完整、连续的&#xff0c;当「…...

基于https虚拟主机配置

一、https介绍 http 明文&#xff0c;80/tcp https 密文&#xff0c;443/tcp 二、安全性保障 1、数据安全性 数据加密 2、数据完整性 3、验证身份的真实性、有效性 三、数据安全性 手段&#xff1a;加密 发送方加密数据&#xff0c;接收方解密数据 对称加密算法 加密、解密数据…...

小白入坑向:Java 全栈系统性学习推荐路线之一

文章目录 一、 引言1.1 学习路径&#xff1a;1.2 技术栈全景概述1.3 前沿技术与趋势预判 二、 前端篇2.1 基础知识2.2 进阶技术2.3 前端框架与工具 三、 后端篇3.1 Java 基础3.2 进阶与新特性 四、 企业级框架与开发工具4.1 构建与项目管理4.2 核心框架4.3 数据持久层4.4 微服务…...

云原生存储架构:构建数据永续的新一代存储基础设施

引言&#xff1a;重新定义数据基础设施边界 蚂蚁集团基于Ceph构建的全闪存存储集群达到EB级规模&#xff0c;单集群IOPS突破1亿&#xff0c;延迟稳定在200μs内。Snowflake的存储计算分离架构使其数据湖查询速度提升14倍&#xff0c;存储成本降低82%。Gartner预测到2025年70%企…...

QTableWidget之表格列的隐藏与显示(折叠)

今天晚上花点时间研究一下表格列的显隐问题&#xff08;类似与excel的隐藏列功能&#xff09;&#xff0c;在网络上搜罗了一通资料&#xff0c;没现成的例子作为借鉴&#xff0c;只能自己研究编写了。现在将过程记录下来&#xff0c;以便日后翻阅。 首先声明&#xff1a;因为时…...

Leetcode3146. 两个字符串的排列差

题目描述&#xff1a; 给你两个字符串 s 和 t&#xff0c;每个字符串中的字符都不重复&#xff0c;且 t 是 s 的一个排列。 排列差 定义为 s 和 t 中每个字符在两个字符串中位置的绝对差值之和。 返回 s 和 t 之间的 排列差 。 代码思路&#xff1a; 建立字符位置映射&…...

二百八十五、华为云PostgreSQL——建分区表并设置主键

一、目的 在PostgreSQL里建表&#xff0c;设置主键&#xff0c;三个字段确认数据的唯一性。设置分区字段&#xff0c;按月分区 二、PostgreSQL版本 三、PostgreSQL 9.2.4 版本缺点 在 PostgreSQL 9.2.4 中&#xff0c;虽然你可以创建分区表&#xff0c;但需要注意的是&#…...

系统架构设计师-第3章 数据库设计

【本章学习建议】 根据考试大纲&#xff0c;本章主要考查系统架构设计师单选题&#xff0c;预计考5分左右&#xff0c;以及案例分析1题&#xff0c;25分。对应第二版教材2.3.3小节以及第6章&#xff0c;主要考点在第6章&#xff0c;这里一起合并到本章课程中。 3.1 数据库基本…...

SciencePlots——绘制论文中的图片

文章目录 安装一、风格二、1 资源 安装 # 安装最新版 pip install githttps://github.com/garrettj403/SciencePlots.git# 安装稳定版 pip install SciencePlots一、风格 简单好用的深度学习论文绘图专用工具包–Science Plot 二、 1 资源 论文绘图神器来了&#xff1a;一行…...

shell脚本--常见案例

1、自动备份文件或目录 2、批量重命名文件 3、查找并删除指定名称的文件&#xff1a; 4、批量删除文件 5、查找并替换文件内容 6、批量创建文件 7、创建文件夹并移动文件 8、在文件夹中查找文件...

centos 7 部署awstats 网站访问检测

一、基础环境准备&#xff08;两种安装方式都要做&#xff09; bash # 安装必要依赖 yum install -y httpd perl mod_perl perl-Time-HiRes perl-DateTime systemctl enable httpd # 设置 Apache 开机自启 systemctl start httpd # 启动 Apache二、安装 AWStats&#xff0…...

五年级数学知识边界总结思考-下册

目录 一、背景二、过程1.观察物体小学五年级下册“观察物体”知识点详解&#xff1a;由来、作用与意义**一、知识点核心内容****二、知识点的由来&#xff1a;从生活实践到数学抽象****三、知识的作用&#xff1a;解决实际问题的工具****四、学习的意义&#xff1a;培养核心素养…...

如何为服务器生成TLS证书

TLS&#xff08;Transport Layer Security&#xff09;证书是确保网络通信安全的重要手段&#xff0c;它通过加密技术保护传输的数据不被窃听和篡改。在服务器上配置TLS证书&#xff0c;可以使用户通过HTTPS协议安全地访问您的网站。本文将详细介绍如何在服务器上生成一个TLS证…...

Unit 1 深度强化学习简介

Deep RL Course ——Unit 1 Introduction 从理论和实践层面深入学习深度强化学习。学会使用知名的深度强化学习库&#xff0c;例如 Stable Baselines3、RL Baselines3 Zoo、Sample Factory 和 CleanRL。在独特的环境中训练智能体&#xff0c;比如 SnowballFight、Huggy the Do…...

【论文阅读28】-CNN-BiLSTM-Attention-(2024)

本文把滑坡位移序列拆开、筛优质因子&#xff0c;再用 CNN-BiLSTM-Attention 来动态预测每个子序列&#xff0c;最后重构出总位移&#xff0c;预测效果超越传统模型。 文章目录 1 引言2 方法2.1 位移时间序列加性模型2.2 变分模态分解 (VMD) 具体步骤2.3.1 样本熵&#xff08;S…...

优选算法第十二讲:队列 + 宽搜 优先级队列

优选算法第十二讲&#xff1a;队列 宽搜 && 优先级队列 1.N叉树的层序遍历2.二叉树的锯齿型层序遍历3.二叉树最大宽度4.在每个树行中找最大值5.优先级队列 -- 最后一块石头的重量6.数据流中的第K大元素7.前K个高频单词8.数据流的中位数 1.N叉树的层序遍历 2.二叉树的锯…...

腾讯云V3签名

想要接入腾讯云的Api&#xff0c;必然先按其文档计算出所要求的签名。 之前也调用过腾讯云的接口&#xff0c;但总是卡在签名这一步&#xff0c;最后放弃选择SDK&#xff0c;这次终于自己代码实现。 可能腾讯云翻新了接口文档&#xff0c;现在阅读起来&#xff0c;清晰了很多&…...

Redis:现代应用开发的高效内存数据存储利器

一、Redis的起源与发展 Redis最初由意大利程序员Salvatore Sanfilippo在2009年开发&#xff0c;其初衷是为了满足他自己的一个项目需求&#xff0c;即需要一个高性能的键值存储系统来解决传统数据库在高并发场景下的性能瓶颈。随着项目的开源&#xff0c;Redis凭借其简单易用、…...