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博客

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/893319.shtml

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

相关文章

若依报错:无法访问com.ruoyi.common.annotation

无法访问com.ruoyi.common.annotation 若依的父工程的pom文件中设置了jdk为1.8&#xff0c;将idea的jdk也改为1.8即可。

< OS 有关 > 阿里云:轻量应用服务器 的使用 安装 Tailscale 后DNS 出错, 修复并替换 apt 数据源

VPS 配置 主机&#xff1a;vCPU x2, 512MB, 20GB位置&#xff1a;阿里云&#xff0c;日本.东京OS&#xff1a; ubuntu24.20 原因&#xff1a; 这篇是操作过程的记录文章。 2 个月前&#xff0c; 在阿里云买了台 vps 。当时本想放到韩国&#xff0c;因为它离北京近。 但最便…

小企业品牌塑造之困-中小企实战运营和营销工作室博客

小企业品牌塑造之困-中小企实战运营和营销工作室博客 在商业的广袤天地中&#xff0c;小企业如点点繁星&#xff0c;怀揣着成长为璀璨星辰的梦想。品牌塑造&#xff0c;无疑是它们迈向成功的关键路径。然而&#xff0c;现实却布满荆棘&#xff0c;众多小企业在品牌塑造的征程中…

HTML5 Canvas和JavaScript的3D粒子星系效果

HTML部分 基本结构包括<html>, <head>, 和 <body>标签。<title>标签设置了页面标题为“优化版3D粒子星系”。<style>块定义了一些基本样式&#xff1a; body&#xff1a;无边距&#xff0c;隐藏滚动条&#xff0c;黑色背景&#xff0c;禁用触摸…

65,【5】buuctf web [SUCTF 2019]Upload Labs 2

进入靶场 1,源代码 点击题目时有个就有个admin.php <?php // 引入配置文件 include config.php;class Ad{public $cmd;public $clazz;public $func1;public $func2;public $func3;public $instance;public $arg1;public $arg2;public $arg3;// 构造函数&#xff0c;用于初…

BLE透传方案,IoT短距无线通信的“中坚力量”

在物联网&#xff08;IoT&#xff09;短距无线通信生态系统中&#xff0c;低功耗蓝牙&#xff08;BLE&#xff09;数据透传是一种无需任何网络或基础设施即可完成双向通信的技术。其主要通过简单操作串口的方式进行无线数据传输&#xff0c;最高能满足2Mbps的数据传输速率&…

12_PlayerPrefs存储登录窗口逻辑_回调函数优化Lamd表达式

创建 登录窗口LoginWnd.cs 绑定 登录窗口LoginWnd.cs 编写 登录窗口LoginWnd.cs using UnityEngine; using UnityEngine.UI; //输入文本 命名空间 //功能 : 登录注册窗口 public class LoginWnd : MonoBehaviour{public InputField iptAcct;public InputField iptPass;public …

西门子【Library of General Functions (LGF) for SIMATIC S7-1200 / S7-1500】

文章目录 概要整体架构流程技术名词解释技术细节小结 概要 通用函数库 (LGF) 扩展了 TIA Portal 中用于 PLC 编程的 STEP 7 指令&#xff08;数学函数、时间、计数器 等&#xff09;。该库可以不受限制地使用&#xff0c;并包含 FIFO 、搜索功能、矩阵计算、 astro 计…

每日一刷——1.20——准备蓝桥杯

链接&#xff1a;登录—专业IT笔试面试备考平台_牛客网 来源&#xff1a;牛客网 题目一 请统计某个给定范围[L, R]的所有整数中&#xff0c;数字2出现的次数。 比如给定范围[2, 22]&#xff0c;数字2在数2中出现了1次&#xff0c;在数12中出现1次&#xff0c;在数20中出现1次&a…

会议签到系统的架构和实现

会议签到系统的架构和实现 摘要:通过定制安卓会议机开机APP呈现签到界面&#xff0c;并且通过W/B结构采集管理签到信息&#xff0c;实现会议签到的功能。为达到此目标本文将探讨使用Redis提供后台数据支持&#xff1b;使用SocketIo处理适时消息&#xff1b;使用Flask进行原型开…

c++ 与 Matlab 程序的数据比对

文章目录 背景环境数据保存数据加载 背景 ***避免数据精度误差&#xff0c;快速对比变量 *** 环境 c下载 https://github.com/BlueBrain/HighFive 以及hdf5库 在vs 中配置库 数据保存 #include <highfive/highfive.hpp> using namespace HighFive;std::string fil…

OSS使用签名URL上传(返回前端上传地址)- NodeJS

使用过程 使用PUT方式的签名URL上传文件的过程如下&#xff1a; 代码示例 文件拥有者生成PUT方法的签名URL const OSS require("ali-oss");// 获取签名URL const client await new OSS({accessKeyId: yourAccessKeyId,accessKeySecret: yourAccessKeySecret,buc…

使用 div 自定义 input 和 textarea

1. 为什么要自定义呢&#xff1f; 原生的 input 和 textarea 在某些特定场景下存在功能或兼容性限制&#xff0c;因此使用 div 元素自定义实现&#xff0c;突破原生输入框在样式、功能、兼容性上的限制。 1、解决火狐浏览器换行问题 某些版本的火狐浏览器中&#xff0c;原生…

Golang的网络编程安全

Golang的网络编程安全 一、Golang网络编程的基本概念 作为一种现代化的编程语言&#xff0c;具有优秀的并发特性和网络编程能力。在Golang中&#xff0c;网络编程是非常常见的需求&#xff0c;可以用于开发各种类型的网络应用&#xff0c;比如Web服务、API服务、消息队列等。Go…

Python新春烟花

目录 系列文章 写在前面 技术需求 完整代码 下载代码 代码分析 1. 程序初始化与显示设置 2. 烟花类 (Firework) 3. 粒子类 (Particle) 4. 痕迹类 (Trail) 5. 烟花更新与显示 6. 主函数 (fire) 7. 游戏循环 8. 总结 注意事项 写在后面 系列文章 序号直达链接爱…

vscode 设置

一、如何在vscode中设置放大缩小代码 1.1.文件—首选项——设置 1.2.在搜索框里输入“Font Ligatures”&#xff0c;然后点击"在settings.json中编辑" 1.3.在setting中&#xff08;"editor.fontLigatures":前&#xff09;添加如下代码 "editor.mous…

航电系统路线规划克隆核心技术!

一、航电系统 航电系统&#xff08;Avionics System&#xff09;是民用飞机的“大脑”与“神经”&#xff0c;分为航电核心处理与数据传感两个部分。航电核心处理系统采用综合模块化、开放式系统结构&#xff0c;为飞机提供公共计算、网络通信和接口、飞行管理、显示与告警、机…

OSCP - Proving Grounds - BullyBox

主要知识点 如果发现有域名&#xff0c;则可以加入/etc/hosts后重新执行nmap,nikto等扫描dirsearch的时候可以使用完整一些的字典文件&#xff0c;避免漏掉信息.git dump 具体步骤 执行nmap 扫描&#xff0c;发现 80和22端口开放,访问后发现被重定向到 bullybox.local Star…

【计算机网络】传输层协议TCP与UDP

传输层 传输层位于OSI七层网络模型的第四层&#xff0c;主要负责端到端通信&#xff0c;可靠性保障&#xff08;TCP&#xff09;&#xff0c;流量控制(TCP)&#xff0c;拥塞控制(TCP)&#xff0c;数据分段与分组&#xff0c;多路复用与解复用等&#xff0c;通过TCP与UDP协议实现…

MongoDB 备份与恢复综述

目录 一、基本概述 二、逻辑备份 1、全量备份 2、增量备份 3、恢复 三、物理备份 1、cp/tar/fsync 2、WiredTiger 热备份 3、恢复 四、快照备份 一、基本概述 MongoDB 是一种流行的 NoSQL 数据库&#xff0c;它使用文档存储数据&#xff0c;支持丰富的查询语言和索引…