C++(6) 继承

文章目录

      • 继承
        • 1. 继承
          • 1.1 什么是继承
          • 1.2 C++ 继承方式
            • 1.2.1 基本案例
            • 1.2.2 继承权限组合
            • 1.2.3 继承中构造函数的说法
            • 1.2.4 继承中析构函数的执行顺序
            • 1.2.5 继承中变量名称冲突问题
            • 1.2.6 继承中函数【重写】

继承

1. 继承
1.1 什么是继承

面向对象程序设计中最重要的一个概念是继承。继承允许我们依据另一个类来定义一个类,这使得创建和维护一个应用程序变得容易。达到重写代码功能和提高执行效率的效果。

当创建一个类时,不需要重新编写新的数据成员和成员函数, 只需要指定新键的类继承了一个已有的类的成员即可。这个已有的类称为基类,新建的类称为派生类

1.2 C++ 继承方式
1.2.1 基本案例

格式

class 子类 : 权限修饰符
{
}
#include <iostream>using namespace std;class Base
{
public:int mA = 1;
protected:int mB = 2;
private:int mC = 3;
};/*
Base 类是 Son 的一个 public 修饰父类
Son 类是 Base 类的一个子类,或者可以认为 Son 类是 Base 类 派生类
*/
class Son : public Base
{
public:int nA = 1;
protected:int nB = 2;
private:int nC = 3;
};int main(int argc, char const *argv[])
{Son * s = new Son;cout << "mA : " << s->mA << endl;// 当情况下,mB 是 Base 类中的 protected 修饰 成员变量,同时使用 public 方式继承// 子类对象无法在类外调用 mB// cout << "mB : " << s->mB << endl;// 当情况下,mB 是 Base 类中的 protected 修饰 成员变量,同时使用 public 方式继承// 子类对象无法s使用mC// cout << "mC : " << s->mC << endl;cout << "nA : " << s->nA << endl;// cout << "nB : " << s->nB << endl;// cout << "nC : " << s->nC << endl;return 0;
}
1.2.2 继承权限组合
继承对应的权限修饰\原修饰符publicprotectedprivate
publicpublicprotected无法继承
protectedprotectedprotected无法继承
privateprivateprivate无法继承
#include <iostream>using namespace std;/*
public:类内、子类类外都可以使用
protected:类内、子类可以使用,类外无法使用
private:类内可以使用,子类、类外无法使用
*/
class Base
{
public:int mA = 1;void test1() { cout << "test1 funtion" << endl; }
protected:int mB = 1;void test2() { cout << "test2 funtion" << endl; }
private:int mC = 1;void test3() { cout << "test3 funtion" << endl; }
};/*
public 继承方式,父类的成员权限修饰符变化public --> publicprotected --> protectedprivate 无法继承
*/
class Son1: public Base
{
public:void test(){cout << mA << endl;cout << mB << endl;// cout << mC << endl;test1();test2();// test3();}
};/*
protected 继承方式,父类的成员权限修饰符变化public --> protectedprotected --> protectedprivate 无法继承
*/
class Son2: protected Base
{
public:void test(){cout << mA << endl;cout << mB << endl;// cout << mC << endl;test1();test2();// test3();}
};/*
private 继承方式,父类的成员权限修饰符变化public --> privateprotected --> privateprivate 无法继承
*/
class Son3: private Base
{void test(){cout << mA << endl;cout << mB << endl;// cout << mC << endl;}
};int main(int argc, char const *argv[])
{Son1 *s1 = new Son1;cout << s1->mA << endl;Son2 *s2 = new Son2;// cout << s2->mA << endl;Son3 *s3 = new Son3;// cout << s3->mA << endl;return 0;
}
1.2.3 继承中构造函数的说法
#include <iostream> using namespace std;class Base
{
public:Base(){cout << "Base 类中的构造函数" << endl;}~Base(){cout << "Base 类析构函数" << endl;}
};class Son : public Base
{
public:Son(){cout << "Son 类构造函数" << endl;}~Son(){cout << "Son 类析构函数" << endl;}
};class GrandSon : public Son
{
public:GrandSon(){cout << "GrandSon 类析构函数" << endl;}~GrandSon(){cout << "GrandSon 类析构函数" << endl;}
};int main(int argc, char const *argv[])
{// 显式调用的时子类的五承诺书构造函数Son *s1 = new Son();/*Base 类构造函数Son 类构造函数*/cout << "----------------------------------" << endl;delete s1;/*Son 类析构函数Base 类析构函数*/cout << "----------------------------------" << endl;GrandSon *s2 = new GrandSon();/*Base 类构造函数Son 类构造函数GrandSon 类构造函数*/cout << "----------------------------------" << endl;delete s2;/*GranSon 类析构函数Son 类析构函数Base 类析构函数*/return 0;
}
1.2.4 继承中析构函数的执行顺序

在这里插入图片描述

1.2.5 继承中变量名称冲突问题
class Base
{
public:int num;
};class Son : public Base
{
public:int num;void test(){// int Son::num;/*如果直接使用,编译器会考虑按照就近原则方式进行数据分配首选是 Son 类中的 num 数据*/cout << num << endl;// int Base::num;/*如果需要使用 Base 中的 num,需要利用 :: 作用域运算符限制当前变量的作用范围*/cout << Base::num << endl;}
};
1.2.6 继承中函数【重写】
#include <iostream>using namespace std;class Father
{
public:void name() { cout << "小鱼丸" << endl; }void hobby() { cout << "唱歌" << endl; }
};/*
函数的重写 Ovreride1. 存在必要的继承关系2. 要求子类重写父类的函数,函数声明必须一致3. 可以按照子类要求完成哈桑农户内容实现重写的存在可以降低开发中函数命名压力
*/
class Son : public Father
{
public:void name() { cout << "Glade" << endl; }void hobby() { cout << "吃" << endl; }
};int main(int argc, char const *argv[])
{Son * s = new Son;  /*子类可以通过 public 继承得到父类中 public 修饰函数,类内调用但是父类的函数有可能无法满足子类的特征需求【重写父类函数】 Override*/s->name();s->hobby();return 0;
}
{
public:void name() { cout << "Glade" << endl; }void hobby() { cout << "吃" << endl; }
};int main(int argc, char const *argv[])
{Son * s = new Son;  /*子类可以通过 public 继承得到父类中 public 修饰函数,类内调用但是父类的函数有可能无法满足子类的特征需求【重写父类函数】 Override*/s->name();s->hobby();return 0;
}

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

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

相关文章

使用xlsx、xlsx-style导出表格添加背景色;合并单元格部分样式缺失问题解决

这篇说一下使用xlsx-style导出excel时样式的设置。需要安装xlsx、xlsx-style、file-saver插件&#xff08;file-saver可以不装&#xff0c;用a标签代替也可以&#xff09;&#xff0c;安装时可能会碰到一些报错问题&#xff0c;可以去看下我之前一篇博客&#xff1a;纯前端导出…

AI投资或成科技裁员罪魁祸首

最近的科技裁员让许多人对这个行业的稳定性产生了疑问。然而&#xff0c;仔细观察发现&#xff0c;这些裁员并不是经济困境的迹象&#xff0c;而是科技公司为了重新调整优先事项并投资未来而进行的战略举措。科技行业正投入数十亿美元用于人工智能&#xff08;AI&#xff09;&a…

深入玩转Playwright:高级操作解析与实践

playwright高级操作 iframe切换 ​ 很多时候&#xff0c;网页可能是网页嵌套网页&#xff0c;就是存在不止一个html标签&#xff0c;这时候我们的selenium或者playwright一般来说定位不到&#xff0c;为什么呢&#xff1f; ​ 因为默认是定位到第一个标准的html标签内部。 …

STM32——USART

一、通信 1.1通信是什么&#xff1b; 通信是将一个设备的数据发送到另一个设备中&#xff0c;从而实现硬件的扩展&#xff1b; 1.2通信的目的是什么&#xff1b; 实现硬件的扩展-在STM32中集成了很多功能&#xff0c;例如PWM输出&#xff0c;AD采集&#xff0c;定时器等&am…

小程序样例5:简单登录界面

基本功能 1、头像选择、用户名、密码、昵称选择、性别、城市 2、确认注册跳转 我的页面。 3、其他注册方式跳转用户名 密码登录方式 4、清除 和 密码显示按钮&#xff1a; 5、用户名、密码合法性校验&#xff1a; 6、点击微信图标&#xff0c;调转回微信登录&#xff1a; 代码…

部署YUM仓库服务

一、yum仓库 1. yum简介 yum是一个基于RPM包&#xff08;是Red-Hat Package Manager红帽软件包管理器的缩写&#xff09;构建的软件更新机制&#xff0c;能够自动解决软件包之间的依赖关系。 为什么会有依赖关系的发生 因为linux本身就是以系统简洁为自身优势&#xff0c;所以…

超超超详细讲解TCP三次握手与四次挥手(大图解),值得收藏

TCP 三次握手与四次挥手深入探究 TCP基础知识 TCP 头格式有哪些 TCP首部包括20字节的固定首部部分及长度可变的其他选项&#xff0c;所以TCP首部长度可变。20个字节又分为5部分&#xff0c;每部分4个字节32位&#xff0c;如图中的前5行&#xff0c;每行表示32位。 TCP 头格…

云服务器如何快速部署访问静态页面(个人网站博客等)

1&#xff0c;购买云服务器 2&#xff0c;配置安全项 云服务器ecs下&#xff0c;配置ip、端口所有人都可访问 3&#xff0c;关闭防火墙&#xff0c;将前端静态项目传输到云服务器上 可以使用SecureCRT&#xff0c;本地远程连接到服务器&#xff08;需要用户名与密码&#x…

LVS常用的NAT模式和DR模式实战示例

引言&#xff1a;紧接上文&#xff0c;了解LVS&#xff0c;这一篇就够了-CSDN博客&#xff0c;今天我们对LVS常用的两种模式来进行示例配置演示 LVS-NAT模式 1、环境准备 准备 3 台纯净的虚拟机 关闭防火墙和selinux 例&#xff1a; lvs-server 添加两个网卡 NAT模式 …

基于连续相位负载调制的单输入宽带混合Doherty功率放大器设计(2023.05 MTT)-从理论到ADS版图

基于连续相位负载调制的单输入宽带混合Doherty功率放大器设计-从理论到ADS版图 最近开始搞大论文了&#xff0c;Doherty方面对最新的一些的技术看的比较少&#xff0c;找几个牛逼的学习一下下&#xff0c;虽然最后可能也用不上。已经完成了理论的推导和ADS版图仿真&#xff0c…

4、this指向、动画案例、封装、offset、client、scroll

一、this指向问题 1、在构造函数中this指向实例化对象 2、在自定义对象的函数&#xff08;方法&#xff09;中指向this指向当前的对象 3、在普通函数中this指向window 4、函数中this指向&#xff1a;在事件函数中this指向事件源 5、在定时器函数中this指向window 二、动…

动态分析C语言代码生成函数调用关系的利器——gprof

大纲 准备工作下载libevent代码安装编译依赖编译libevent 收集运行数据编译插入检测代码的可执行程序收集数据 数据转换环境准备转换为dot 转换为图片环境准备转换图片 参考代码参考资料 gprof是一个C语言程序性能分析工具。在编译期间&#xff0c;我们给编译指令增加-pg选项&a…

第 8 章:Linux中使用时钟、计时器和信号

在本章中&#xff0c;我们将开始探索Linux环境中可用的各种计时器。随后&#xff0c;我们将深入了解时钟的重要性&#xff0c;并探讨UNIX时间的概念。接下来&#xff0c;我们将揭示在Linux中使用POSIX准确测量时间间隔的方法。之后&#xff0c;我们将进入std::chrono的领域&…

创业7年复盘,中美企业服务市场差异浅析

2024 年伊始&#xff0c;Kyligence 联合创始人兼 CEO 韩卿在公司内部的飞书订阅号发表了多篇 Rethink Data & Analytics 的内部信&#xff0c;分享了对数据与分析行业的一些战略思考&#xff0c;尤其是 AI 带来的各种变化和革命&#xff0c;是如何深刻地影响这个行业乃至整…

一篇文带你使用js实现拖拽排序

先介绍一下html5的drag属性,拖放&#xff08;Drag 和 drop&#xff09;是 HTML5 标准的组成部分。想要启用drag&#xff0c;只要给元素加上draggable"true"就行了&#xff08;Safari 5.1.2除外&#xff09;。   实际效果&#xff1a; 拖动事件(了解事件详情)   事…

Node.js 模块化

一、介绍 1.1 什么是模块化与模块 ? 将一个复杂的程序文件依据一定规则&#xff08;规范&#xff09;拆分成多个文件的过程称之为 模块化 其中拆分出的 每个文件就是一个模块 &#xff0c;模块的内部数据是私有的&#xff0c;不过模块可以暴露内部数据以便其他 模块使用 1…

股票市场

&#xff08;一&#xff09;股票市场 顾名思义&#xff0c;就是买卖股票的场所。就是为了撮合想发展但缺钱的企业与有钱但想投资的投资者。 股票市场按照交易场所&#xff0c;可分为场内市场和场外市场&#xff1a; 场内市场是指证券交易所&#xff0c; 场外市场就是证券交易…

【Linux】Linux环境基础开发工具使用

上篇博客我们学习了Linux权限相关知识&#xff0c;那么这节课我们来学习一下Linux环境基础开发工具使用吧~&#xff0c;主要包括yum、vim、gcc/g的使用&#xff0c;以及Linux项目自动化构建工具。 目录 Linux软件包管理器--yum yum是什么 yum相关操作 yum本地配置 Linux编…

蓝桥杯-循环节长度

两个整数做除法&#xff0c;有时会产生循环小数&#xff0c;其循环部分称为: 循环节。比如&#xff0c;11/136>0.8461553846153..... 其循环节为[846153] 共有 6 位。下面的方法&#xff0c;可以求出循环节的长度。请仔细阅读代码&#xff0c;并填写划线部分缺少的代码。 注…

redis—Zset有序集合

目录 前言 1.常见命令 2.使用场景 3.渐进式遍历 4.数据库管理 前言 有序集合相对于字符串、列表、哈希、集合来说会有一-些陌生。它保留了集合不能有重复成员的 特点&#xff0c;但与集合不同的是&#xff0c;有序集合中的每个元素都有-个唯- -的浮 点类型的分数(score) …