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 继承权限组合
继承对应的权限修饰\原修饰符 | public | protected | private |
---|---|---|---|
public | public | protected | 无法继承 |
protected | protected | protected | 无法继承 |
private | private | private | 无法继承 |
#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;
}
相关文章:

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 什么是继承 面向对象程序设计中最重要的一个概念是继…...

【Servlet】Smart Tomcat插件简化Servlet开发流程及解决常见问题
个人主页:兜里有颗棉花糖 欢迎 点赞👍 收藏✨ 留言✉ 加关注💓本文由 兜里有颗棉花糖 原创 收录于专栏【Servlet】 本专栏旨在分享学习Servlet的一点学习心得,欢迎大家在评论区交流讨论💌 目录 一、Smart Tomcat插件二…...
解决Qt连接不上mysql数据库
问题: QSqlDatabase: QMYSQL driver not loaded QSqlDatabase: available drivers: QSQLITE QODBC QODBC3 QPSQL QPSQL7 下载网盘中的三个文件(网盘链接在文章结尾):qsqlmysql.dll、qsqlmysqld.qll、libmysql.dll找到你安装Qt的目录ÿ…...

kubernetes-快速部署一套k8s集群
1、前置知识点 1.1 生产环境可部署Kubernetes集群的两种方式 目前生产部署Kubernetes集群主要有两种方式: kubeadm Kubeadm是一个K8s部署工具,提供kubeadm init和kubeadm join,用于快速部署Kubernetes集群。 二进制包 从github下载发行…...

Windows Server 安装 Docker
一、简介 Docker 不是一个通用容器工具,它依赖运行的 Linux 内核环境。Docker 实质上是在运行的 Linux 服务器上制造了一个隔离的文件环境,所以它执行的效率几乎等同于所部署的 Linux 主机服务器性能。因此,Docker 必须部署在 Linux 内核系统…...

智能分析网关V4智慧机房:视频AI智能安全监管方案
一、背景分析 随着互联网的迅猛发展,机房及其配套设施的数量持续攀升,它们的运行状况对于企业运营效率和服务质量的影响日益显著。作为企业信息化的基石,机房的安全监测与管理的重要性不容忽视。它不仅关乎企业的稳定运营,同时也直…...

一些反序列化总结
1 反序列化漏洞原理 如果反序列化的内容就是那串字符串,是用户可以控制的(即变量的值),且后台不正当的使用了PHP中的魔法函数,就会导致反序列化漏洞,可以执行任意命令。Java 序列化指 Java 对象转换为字节序…...
分披萨(100%用例)C卷(JavaPythonC++Node.jsC语言)
“吃货”和“馋嘴”两人到披萨店点了一份铁盘(圆形)披萨,并咐店员将披萨按放射状切成大小相同的偶数扇形小块。但是粗心服务员将披萨切成了每块大小都完全不同奇数块,且肉眼能分辨出大小。 由于两人都想吃到最多的披萨,他们商量了一个他们认为公平的分法:从“吃货开始,轮流…...
SQL字符串截取函数【简笔记】
MySQL提供了多种字符串函数来处理和截取字符串。下面是一些常用的字符串截取函数及其使用示范: SUBSTRING(str, pos, len) str 是要截取的字符串。pos 是开始截取的位置。len 是截取的长度。 示例: SELECT SUBSTRING(Hello, World!, 8, 5); -- 结果: "World…...

会话技术复习笔记
一.登录校验的需求 什么是登录校验? 所谓登录校验,指的是我们在服务器端接收到浏览器发送过来的请求之后,首先我们要对请求进行校验。先要校验一下用户登录了没有,如果用户已经登录了,就直接执行对应的业务操作就可以…...

我用Rust开发Rocketmq name server
我是蚂蚁背大象(Apache EventMesh PMC&Committer),文章对你有帮助给Rocketmq-rust star,关注我GitHub:mxsm,文章有不正确的地方请您斧正,创建ISSUE提交PR~谢谢! Emal:mxsmapache.com 1. Rocketmq-rust namesrv概述 经过一个多月的开发,终…...

【Deep Dive: Al Webinar】开源人工智能中赋能、透明性和可重复性三者之间的关系...
【深入探讨人工智能】网络研讨系列总共有 17 个视频。我们按照视频内容,大致上分成了 3 个大类: 1. 人工智能的开放、风险与挑战(4 篇) 2. 人工智能的治理(总共 12 篇),其中分成了几个子类&…...

将Html页面转换为Wordpress页面
问题:我们经常会从html源码下载网站上获得我们想要的网站内容框架,以及部分诸如联系我们,About 等内页,但是在文章的发布上,则远不如Wordpress简便。而Wordpress尽管有各种模板,但修改又比较麻烦。解决方法…...
Next.js 学习笔记(七)——样式
样式 Next.js 支持不同的应用程序样式设计方法,包括: 全局 CSS:对于有传统 CSS 使用经验的人来说,使用简单且熟悉,但随着应用程序的增长,可能会导致 CSS 包过大,难以管理样式。CSS 模块&#…...

金线检测步骤
半导体行业,金线检测是必不可以少的一个检测项,除了焊点,die面,手指以外的必检项目. 重难点在于金线的提取,算法多种多样,找到适合才是关键,涉及到打光,图像处理,这里不做深入分析,软件和硬件配合好才能做的最好. 经典算法Block分析,结合图像检测. 高斯算法提取 边缘检测算法提…...

电池-电量监测基础知识
一、为何要进行电池电量监测 不知各位有没有想过为何现在手机电池和笔记本电脑电池不容易鼓包了?十年前还经常出现的电池鼓包最近像是消失了一样,其实是因为随着电量监测技术的发展,哪怕是最基本的电子设备也有电池侧和产品侧至少两级电量监测…...

西瓜书学习笔记——层次聚类(公式推导+举例应用)
文章目录 算法介绍实验分析 算法介绍 层次聚类是一种将数据集划分为层次结构的聚类方法。它主要有两种策略:自底向上和自顶向下。 其中AGNES算法是一种自底向上聚类算法,用于将数据集划分为层次结构的聚类。算法的基本思想是从每个数据点开始࿰…...

深度视觉目标跟踪进展综述-论文笔记
中科大学报上的一篇综述,总结得很详细,整理了相关笔记。 1 引言 目标跟踪旨在基于初始帧中指定的感兴趣目标( 一般用矩形框表示) ,在后续帧中对该目标进行持续的定位。 基于深度学习的跟踪算法,采用的框架包括相关滤波器、分类…...

【数据结构:顺序表】
文章目录 线性表顺序表1.1 顺序表结构的定义1.2 初始化顺序表1.3 检查顺序表空间1.4 打印1.5 尾插1.6 头插1.7 尾删1.8 头删1.9 查找1.10 指定位置插入1.11 删除指定位置数据1.12 销毁顺序表 数据结构(Data Structure)是计算机存储、组织数据的方式,指相互之间存在一…...
android tts播报破音解决方案汇总
导航app引导中经常遇到破音,这里也将之前经历过的方案收集以下,方便以后选择: 1 对于开始和结尾破音: 可以用升降音来处理 两种方式 一种是 直接对开始和结束的时间段进行音量直接渐进改变。这里配的是200ms的渐变。 VolumeSha…...
云原生核心技术 (7/12): K8s 核心概念白话解读(上):Pod 和 Deployment 究竟是什么?
大家好,欢迎来到《云原生核心技术》系列的第七篇! 在上一篇,我们成功地使用 Minikube 或 kind 在自己的电脑上搭建起了一个迷你但功能完备的 Kubernetes 集群。现在,我们就像一个拥有了一块崭新数字土地的农场主,是时…...
Java 8 Stream API 入门到实践详解
一、告别 for 循环! 传统痛点: Java 8 之前,集合操作离不开冗长的 for 循环和匿名类。例如,过滤列表中的偶数: List<Integer> list Arrays.asList(1, 2, 3, 4, 5); List<Integer> evens new ArrayList…...
【Java学习笔记】Arrays类
Arrays 类 1. 导入包:import java.util.Arrays 2. 常用方法一览表 方法描述Arrays.toString()返回数组的字符串形式Arrays.sort()排序(自然排序和定制排序)Arrays.binarySearch()通过二分搜索法进行查找(前提:数组是…...

渗透实战PortSwigger靶场-XSS Lab 14:大多数标签和属性被阻止
<script>标签被拦截 我们需要把全部可用的 tag 和 event 进行暴力破解 XSS cheat sheet: https://portswigger.net/web-security/cross-site-scripting/cheat-sheet 通过爆破发现body可以用 再把全部 events 放进去爆破 这些 event 全部可用 <body onres…...
鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个生活电费的缴纳和查询小程序
一、项目初始化与配置 1. 创建项目 ohpm init harmony/utility-payment-app 2. 配置权限 // module.json5 {"requestPermissions": [{"name": "ohos.permission.INTERNET"},{"name": "ohos.permission.GET_NETWORK_INFO"…...

微信小程序云开发平台MySQL的连接方式
注:微信小程序云开发平台指的是腾讯云开发 先给结论:微信小程序云开发平台的MySQL,无法通过获取数据库连接信息的方式进行连接,连接只能通过云开发的SDK连接,具体要参考官方文档: 为什么? 因为…...

【论文阅读28】-CNN-BiLSTM-Attention-(2024)
本文把滑坡位移序列拆开、筛优质因子,再用 CNN-BiLSTM-Attention 来动态预测每个子序列,最后重构出总位移,预测效果超越传统模型。 文章目录 1 引言2 方法2.1 位移时间序列加性模型2.2 变分模态分解 (VMD) 具体步骤2.3.1 样本熵(S…...
【碎碎念】宝可梦 Mesh GO : 基于MESH网络的口袋妖怪 宝可梦GO游戏自组网系统
目录 游戏说明《宝可梦 Mesh GO》 —— 局域宝可梦探索Pokmon GO 类游戏核心理念应用场景Mesh 特性 宝可梦玩法融合设计游戏构想要素1. 地图探索(基于物理空间 广播范围)2. 野生宝可梦生成与广播3. 对战系统4. 道具与通信5. 延伸玩法 安全性设计 技术选…...

Spring Cloud Gateway 中自定义验证码接口返回 404 的排查与解决
Spring Cloud Gateway 中自定义验证码接口返回 404 的排查与解决 问题背景 在一个基于 Spring Cloud Gateway WebFlux 构建的微服务项目中,新增了一个本地验证码接口 /code,使用函数式路由(RouterFunction)和 Hutool 的 Circle…...
rnn判断string中第一次出现a的下标
# coding:utf8 import torch import torch.nn as nn import numpy as np import random import json""" 基于pytorch的网络编写 实现一个RNN网络完成多分类任务 判断字符 a 第一次出现在字符串中的位置 """class TorchModel(nn.Module):def __in…...