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

C++ 面向对象(继承)

三、继承

3.1 继承的概念

基于一个已有的类 去重新定义一个新的类,这种方式我们叫做继承

关于继承的称呼

一个类B 继承来自 类 A 我们一般称呼

A类:父类 基类

B类: 子类 派生类

B继承自A A 派生了B

示例图的语法

class vehicle // 车类
{}class car:public vehicle
{}

3.2 继承的意义

1、可以实现代码复用,减少重复代码的劳动量

2、继承是实现多态的必要条件

3、继承本身就是为了实现多态的,顺便实现了代码复用

3.3 继承的基本语法

3.3.1 使用方法

3.3.1.1 基本语法
class 子类名称:继承方式 父类名称
{子类新增的成员;
}class B:public A
{
}
3.3.1.2 基类对象初始化

在子类的构造函数中,通常需要在初始化列表中显式调用基类的构造函数,以完成对基类成员的初始化。例如:

在继承时,需要在子类的构造函数的初始化表中

显性的调用父类的构造函数 来完成对父类成员的初始化格式

构造函数名(int val_1 , int val_2): class_A(val_1 , val_2);

3.3.1.3 派生类中调用基类

在派生类中可以通过以下方式调用基类的成员:

类外访问:
    对象名.基类名::变量;
    对象名.基类名::函数名(函数的实参表);


类内访问:
    基类名::变量;
    基类名::函数名(函数的实参表);

3.3.2 示例代码一(基本语法1)

#include <iostream>
#include <string>using namespace std;class person
{
private:public:string name;int id;int height;public:person(string name , int id , int height):name(name) , id(id) , height(height){cout << "父亲构造函数" << endl;}
};class man : public person
{
private:string name;
public:man(string name , int  id ,int height): person(name , id ,height){}void show_data(){cout << person::name << " " << person::id << " " << this->height << endl ; }
};int main(int argc, char const *argv[])
{man m("张三" , 1 , 131);m.show_data();return 0;
}

示例代码1 运行结果如下:

3.3.3 示例代码二(基本语法2)

#include <iostream>
#include <string>using namespace std;class person
{
private:public:string name;string sex;int age;public : person(string name ,int age ,string sex):name(name), age(age) ,sex(sex){cout << "父类有参构造" << endl;}person(){name = "未设置姓名";age = -1;sex = "沃尔玛塑料袋";cout << "父类无参构造" << endl;}~person(){cout << "我是父类的析构" << endl ;}};class student:public person
{
private:public:int id;public:student(string name , string sex ,int age ,int id):person(name , age , sex ) , id(id){cout << "子类有参构造" << endl;}student(){name = "未设置姓名";age  = -1;sex  = "沃尔玛塑料袋";id   = -1 ;cout << "子类无参构造" << endl;}~student(){cout <<"我是子类的析构" << endl ;}
public:void show_data(){cout << "姓名 " << name << endl;cout << "年龄 " << person::age << endl;cout << "性别 " << this->sex << endl;cout << "学号 " << this->id << endl;}
};int main(int argc, char const *argv[])
{student s1 ;s1.name ="张三";s1.person::age = 10;s1.sex = "男";s1.id = 10;s1.show_data();return 0;
}

示例代码2 运行结果如下:

 

3.4 继承的方式

3.4.1 类中的访问控制权限

类内子类类外
public
protected×
private××

而在继承中 也有三种访问方式:publicprotectedprivate

  • 公共继承 public
  • 保护继承 protected
  • 私有继承 private

访问关系如下图:

image-20241010215659071

3.4.2 示例代码三(继承方式

#include <iostream>
#include <string>using namespace std;class person
{
private:string name;
private:int age;
protected:string sex;public:person(string name ,int age ,string sex):name(name) , age(age) , sex(sex){cout << "父类有参构造" << endl;}person(){name = "未设置姓名";age = -1 ;sex = "沃尔玛塑料袋";cout << "父类无参构造" << endl;}~person(){cout << "我是父类的析构" << endl;}
};class student : private person
{
private:public:int id;
public:student(string name ,string sex ,int age ,int id):person(name ,age ,sex),id(id){cout <<"子类有参构造" << endl;}student(){cout << "子类无参构造" << endl;}~student(){cout<< "我是子类的析构" << endl;}
public:void show_data(){}};class son : private student
{
private:public:son(){student::id = 10;}~son(){}
};int main(int argc, char const *argv[])
{son s;while (1){/* code */}return 0;
}

示例代码3  运行结果如下:

3.5 继承的底层解释

实际开发中 一般继承都采用 pubilc 继承方式

如果不写继承方式,默认使用的都是 private 方式继承

1、子类中会继承父类中所有成员 ,包括私有成员,只不过在子类中不能直接访问父类私有成员需要父类提供公有的函数来访问父类的私有成员

2、当父子类中出现了同名的函数时,访问来也不会冲突,即使形参不同,也不构成重载关系 愿意是两个函数不在同一个空间内,如果想访问父类的成员 需要加 类名 :: 来修饰

类外访问:
    对象名.基类名::变量;
    对象名.基类名::函数名(函数的实参表);
类内访问:
    基类名::变量;
    对象名.基类名::函数名(函数的实参表);

 3.5.1 示例代码四(继承模型)

#include <iostream>
#include <string>using namespace std;class person
{
private:string name;    // 姓名string sex;     // 性别int age;        // 年龄public:void set_name(string name){this->name = name;cout << name << endl;}
};class student:public person
{
private:    
public://1、子类如何访问父类的私有成员void set_data(string name , string sex , int age ){person::set_name(name);}//2、当父类 和 子类 函数名冲突时 咋办void set_name(string name){person::set_name(name);}~student(){person();}
};int main(int argc, char const *argv[])
{student s1;s1.set_name("张三");student s2;s2.set_data("王五","男",11);person p1;p1.set_name("李四");return 0;
}

示例代码4 运行结果如下:

 

##拓展 在继承中析构和构造的区别

 #构造

1、父类的构造函数不会被子类继承

2、需要在子类的构造函数的初始列表中,显性的调用父类函数的构造函数
    完成对父类中继承过来的成员初始化
    
3、如果没有在子类的构造函数初始化列表中调用父类中的构造函数 则使用无参构造
    如果父类没有无参构造 会报错
    
4、构造函数的调用顺序是
    先调用父类函数的构造函数
    再调用子类函数的构造函数

#析构

1、父类的析构函数不会被子类继承
    
2、不管是否显性调用父类的析构函数,父类的析构函数都会被调用
    完成对父类中继承过来的成员的善后工作
    
3、子类的析构函数中 无需调用父类的析构函数
    
4、析构函数的调用顺序是
    先调用子类函数的析构函数
    再调用父类函数的析构函数




前情回顾: ​​​​​​​

第一篇

C++ 面向对象(封装)-CSDN博客

第二篇

C++ 面向对象(构造 & 析构函数)-CSDN博客

相关文章:

C++ 面向对象(继承)

三、继承 3.1 继承的概念 基于一个已有的类 去重新定义一个新的类&#xff0c;这种方式我们叫做继承 关于继承的称呼 一个类B 继承来自 类 A 我们一般称呼 A类&#xff1a;父类 基类 B类: 子类 派生类 B继承自A A 派生了B 示例图的语法 class vehicle // 车类 {}class …...

Top期刊算法!RIME-CNN-BiLSTM-Attention系列四模型多变量时序预测

Top期刊算法&#xff01;RIME-CNN-BiLSTM-Attention系列四模型多变量时序预测 目录 Top期刊算法&#xff01;RIME-CNN-BiLSTM-Attention系列四模型多变量时序预测预测效果基本介绍程序设计参考资料 预测效果 基本介绍 基于RIME-CNN-BiLSTM-Attention、CNN-BiLSTM-Attention、R…...

数据结构 数组

1. 常见的错误 这里我要特别纠正一个“错误”。我在面试的时候&#xff0c;常常会问数组和链表的区别&#xff0c;很多人都回答说&#xff0c;“链表适合插入、删除&#xff0c;时间复杂度O(1)&#xff1b;数组适合查找&#xff0c;查找时间复杂度为O(1)”。 实际上&#xff…...

Kivy App开发之UX控件Bubble气泡

kivy提供了一个提示气泡的小控件Bubble,使用时可以指定气泡箭头的方向以及显示的图像,还可以作为容器添加其他小控件。 常用属性如下 属性说明orientation气泡内子项的排序方式,可设置为vertical或horizontal,默认horizontalarrow_pos箭头相对于气泡的位置,可设置为left_…...

从零到一:打造属于你的AI智能体,支持本地部署

国外卷智能体&#xff0c;国内也都在搞 AI Agent&#xff0c;2025 年也将成为 Agent 的元年。构建智能体主要两种情况&#xff0c;一个是工作流模式&#xff0c;另外一种是直接开发应用&#xff0c;接下来分别给大家介绍一下两种产品和构建过程。工作流模式&#xff0c;以 Coze…...

成就与远见:2024年技术与思维的升华

个人主页&#xff1a;chian-ocean 前言: 2025年1月17日&#xff0c;2024年博客之星年度评选——创作影响力评审的入围名单公布。我很荣幸能够跻身Top 300&#xff0c;虽然与顶尖博主仍有一定差距&#xff0c;但这也为我提供了更加明确的发展方向与指引。展望崭新的2025年&…...

深搜与回溯——扫地机器人问题解析与代码实现

一、题目内容 题目描述 扫地机器人在一个 nm 的网格中从左上角&#xff08;1,1&#xff09;开始清扫。它按照以下规则移动&#xff1a; 如果当前位置的右边&#xff08;同一行&#xff0c;下一列&#xff09;没有被清扫过&#xff0c;它会向右移动。 如果右边无法移动&#xf…...

【大数据2025】Hadoop 万字讲解

文章目录 一、大数据通识大数据诞生背景与基本概念大数据技术定义与特征大数据生态架构概述数据存储数据计算与易用性框架分布式协调服务和任务调度组件数仓架构流处理架构 二、HDFSHDFS 原理总结一、系统架构二、存储机制三、数据写入流程四、心跳机制与集群管理 安全模式&…...

win内核内部直接irp读取文件写入文件

#include <ntifs.h> #include <ntddk.h> #define TAG_NAME tlfF // FltF in reverse #define BUFFER_SIZE PAGE_SIZE // 驱动设备扩展结构 typedef struct _DEVICE_EXTENSION { PDEVICE_OBJECT DeviceObject; UNICODE_STRING DeviceName; UNICODE_STRIN…...

1. 基于图像的三维重建

1. 基于图像的三维重建 核心概念三维重建中深度图、点云的区别&#xff1f;深度图点云总结 深度图到点云还需要什么步骤&#xff1f;1. **获取相机内参**2. **生成相应的像素坐标**3. **计算三维坐标**4. **构建点云**5. **处理颜色信息&#xff08;可选&#xff09;**6. **去除…...

如何确保Python爬虫不违反微店规定

在使用Python爬虫获取微店商品详情时&#xff0c;确保爬虫行为符合微店的规定和相关法律法规至关重要。以下是一些关键步骤和注意事项&#xff0c;帮助你合法合规地使用爬虫技术&#xff1a; 一、遵守法律法规 在使用爬虫技术时&#xff0c;必须严格遵守《网络安全法》、《个…...

Spring Event和MQ的区别和使用场景

概念 Spring事件&#xff08;Spring Event&#xff09;是Spring框架的一项功能&#xff0c;它允许不同组件之间通过发布-订阅机制进行解耦的通信。 MQ一般是一个独立的中间件&#xff0c;它可以通过消息队列对消息进行传递和存储&#xff0c;生产者将消息发送到MQ&#xff0c;…...

SpringBoot:websocket 实现后端主动前端推送数据

简单说明下websocket实用场景。 实时通信领域&#xff1a;社交聊天弹幕多玩家游戏协同编辑股票基金实时报价体育实况更新视频会议/聊天基于位置的应用在线教育智能家居等需要高实时性的场景 一、服务端代码 pom.xml&#xff1a; <dependencies><dependency><…...

嵌入式硬件篇---PID控制

文章目录 前言第一部分&#xff1a;连续PID1.比例&#xff08;Proportional&#xff0c;P&#xff09;控制2.积分&#xff08;Integral&#xff0c;I&#xff09;控制3.微分&#xff08;Derivative&#xff0c;D&#xff09;控制4.PID的工作原理5..实质6.分析7.各种PID控制器P控…...

小程序获取微信运动步数

1、用户点击按钮&#xff0c;在小程序中触发getuserinfo方法&#xff0c;获取用户信息 <scroll-view class"scrollarea" scroll-y type"list"><view class"container"><button bind:tap"getLogin">获取</button&…...

5G 核心网 相关概念快速入门

在我们开始阅读3GPP协议来学习5G核心网之前&#xff0c; 不妨来看看我之前整理的PPT&#xff0c;快速学习核心网相关概念&#xff0c; 以及5G转发面PFCP协议的相关核心知识。 涵盖了最精简的核心骨干内容&#xff0c;助你轻松上阵。 讲解目标 3GPP和相关协议 5G核心网架构模…...

【2024 年度总结】从小白慢慢成长

【2024 年度总结】从小白慢慢成长 1. 加入 CSDN 的契机2. 学习过程2.1 万事开头难2.2 下定决心开始学习2.3 融入技术圈2.4 完成万粉的目标 3. 经验分享3.1 工具的选择3.2 如何提升文章质量3.3 学会善用 AI 工具 4. 保持初心&#xff0c;继续前行 1. 加入 CSDN 的契机 首次接触…...

SAP POC 项目完工进度 - 收入确认方式【工程制造行业】【新准则下工程项目收入确认】

1. SAP POC收入确认基础概念 1.1 定义与原则 SAP POC&#xff08;Percentage of Completion&#xff09;收入确认方式是一种基于项目完工进度来确认收入的方法。其核心原则是根据项目实际完成的工作量或成本投入占预计总工作量或总成本的比例&#xff0c;来确定当期应确认的收…...

vue3+three.js加载glb模型

<template><div><!-- 亮度调节滑块 --><div class"controls"><label for"brightness">背景光亮度&#xff1a;</label><inputtype"range"id"brightness"v-model"brightness"min&quo…...

Golang Gin系列-4:Gin Framework入门教程

在本章中&#xff0c;我们将深入研究Gin&#xff0c;一个强大的Go语言web框架。我们将揭示制作一个简单的Gin应用程序的过程&#xff0c;揭示处理路由和请求的复杂性。此外&#xff0c;我们将探索基本中间件的实现&#xff0c;揭示精确定义路由和路由参数的技术。此外&#xff…...

OpenClaw压力测试:百川2-13B-4bits连续处理1000个文件的稳定性

OpenClaw压力测试&#xff1a;百川2-13B-4bits连续处理1000个文件的稳定性 1. 测试背景与目标 去年冬天的一个深夜&#xff0c;我正被堆积如山的PDF合同审核工作折磨得焦头烂额。当时突发奇想&#xff1a;如果用AI自动处理这些文件会怎样&#xff1f;这个念头直接促成了本次压…...

阿姆智创15.6寸工业工控触摸一体机,赋能机器视觉与SMT产线场景,源头工厂ODM定制方案

在电子制造高速发展的今天&#xff0c;机器视觉检测与SMT贴片生产线已成为智能制造的重要载体&#xff0c;对工业控制终端的显示精度、运算性能、接口拓展及环境适应性提出了更高要求。阿姆智创15.6寸工业工控触摸一体机&#xff0c;以高清显示、工业级稳定性能、全场景接口配置…...

Burpsuite之暴力破解+验证码识别 | 添柴不加火始

springboot自动配置 自动配置了大量组件&#xff0c;配置信息可以在application.properties文件中修改。 当添加了特定的Starter POM后&#xff0c;springboot会根据类路径上的jar包来自动配置bean&#xff08;比如&#xff1a;springboot发现类路径上的MyBatis相关类&#xff…...

WarcraftHelper终极指南:如何让经典魔兽争霸III在现代电脑上完美运行

WarcraftHelper终极指南&#xff1a;如何让经典魔兽争霸III在现代电脑上完美运行 【免费下载链接】WarcraftHelper Warcraft III Helper , support 1.20e, 1.24e, 1.26a, 1.27a, 1.27b 项目地址: https://gitcode.com/gh_mirrors/wa/WarcraftHelper 还在为魔兽争霸III在…...

Zookeeper分布式协调

一、总览图1、定义 ZooKeeper 集群协调器 它是一个分布式协调服务&#xff0c;专门为分布式应用提供一致性、可靠性的协调功能&#xff0c;解决分布式环境下的数据同步、配置管理、状态监控等问题。 2、部署3、数据模型 Znode树结构&#xff1a;采用层级化的命名空间&#xff…...

Blazor组件化演进终极指南:2026年必须掌握的5大架构范式与3种反模式规避清单

第一章&#xff1a;Blazor组件化演进的底层动因与2026技术坐标系Blazor 的组件化并非单纯语法糖的迭代&#xff0c;而是对 Web 前端架构范式、.NET 生态边界以及现代云原生交付链路三重压力下的系统性响应。其底层动因根植于三个不可逆趋势&#xff1a;WebAssembly 运行时成熟度…...

嵌入式MCU菜单框架设计与优化实践

1. 项目概述"产品级MCU菜单框架"这个标题背后&#xff0c;隐藏着嵌入式开发中一个经典痛点——如何在资源受限的单片机上实现灵活、可维护的人机交互界面。作为一名在工业控制领域摸爬滚打多年的工程师&#xff0c;我见过太多项目因为前期轻视菜单设计&#xff0c;导…...

嵌入式真有效值计算库:Irms_calc高精度电流测量方案

1. Irms_calc库概述&#xff1a;面向嵌入式平台的高精度交流电流有效值计算引擎Irms_calc是一个专为ESP8266、ESP32及Arduino兼容平台设计的轻量级、高鲁棒性交流电流有效值&#xff08;Irms&#xff09;计算库。其核心目标并非简单地对ADC采样值做数学平均&#xff0c;而是构建…...

UMS3 Helper:ESP32-S3开发板硬件抽象库详解

1. UMS3 Helper 库概述UMS3 Helper 是为 Unexpected Maker 全系列 ESP32-S3 开发板量身定制的底层硬件抽象辅助库&#xff0c;覆盖 NanoS3、OMGS3、TinyS3、ProS3、FeatherS3 及 FeatherS3 Neo 六款主流型号。该库并非通用型驱动框架&#xff0c;而是深度耦合各板载外设物理布局…...

AI时代的算法思维:大经典排序学习驯

引言 在现代软件开发中&#xff0c;性能始终是衡量应用质量的重要指标之一。无论是企业级应用、云服务还是桌面程序&#xff0c;性能优化都能显著提升用户体验、降低基础设施成本并增强系统的可扩展性。对于使用 C# 开发的应用程序而言&#xff0c;性能优化涉及多个层面&#x…...