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

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;
}

相关文章:

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开发流程及解决常见问题

个人主页&#xff1a;兜里有颗棉花糖 欢迎 点赞&#x1f44d; 收藏✨ 留言✉ 加关注&#x1f493;本文由 兜里有颗棉花糖 原创 收录于专栏【Servlet】 本专栏旨在分享学习Servlet的一点学习心得&#xff0c;欢迎大家在评论区交流讨论&#x1f48c; 目录 一、Smart Tomcat插件二…...

解决Qt连接不上mysql数据库

问题: QSqlDatabase: QMYSQL driver not loaded QSqlDatabase: available drivers: QSQLITE QODBC QODBC3 QPSQL QPSQL7 下载网盘中的三个文件&#xff08;网盘链接在文章结尾&#xff09;&#xff1a;qsqlmysql.dll、qsqlmysqld.qll、libmysql.dll找到你安装Qt的目录&#xff…...

kubernetes-快速部署一套k8s集群

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

Windows Server 安装 Docker

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

智能分析网关V4智慧机房:视频AI智能安全监管方案

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

一些反序列化总结

1 反序列化漏洞原理 如果反序列化的内容就是那串字符串&#xff0c;是用户可以控制的&#xff08;即变量的值&#xff09;&#xff0c;且后台不正当的使用了PHP中的魔法函数&#xff0c;就会导致反序列化漏洞&#xff0c;可以执行任意命令。Java 序列化指 Java 对象转换为字节序…...

分披萨(100%用例)C卷(JavaPythonC++Node.jsC语言)

“吃货”和“馋嘴”两人到披萨店点了一份铁盘(圆形)披萨,并咐店员将披萨按放射状切成大小相同的偶数扇形小块。但是粗心服务员将披萨切成了每块大小都完全不同奇数块,且肉眼能分辨出大小。 由于两人都想吃到最多的披萨,他们商量了一个他们认为公平的分法:从“吃货开始,轮流…...

SQL字符串截取函数【简笔记】

MySQL提供了多种字符串函数来处理和截取字符串。下面是一些常用的字符串截取函数及其使用示范&#xff1a; SUBSTRING(str, pos, len) str 是要截取的字符串。pos 是开始截取的位置。len 是截取的长度。 示例: SELECT SUBSTRING(Hello, World!, 8, 5); -- 结果: "World…...

会话技术复习笔记

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

我用Rust开发Rocketmq name server

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

【Deep Dive: Al Webinar】开源人工智能中赋能、透明性和可重复性三者之间的关系...

【深入探讨人工智能】网络研讨系列总共有 17 个视频。我们按照视频内容&#xff0c;大致上分成了 3 个大类&#xff1a; 1. 人工智能的开放、风险与挑战&#xff08;4 篇&#xff09; 2. 人工智能的治理&#xff08;总共 12 篇&#xff09;&#xff0c;其中分成了几个子类&…...

将Html页面转换为Wordpress页面

问题&#xff1a;我们经常会从html源码下载网站上获得我们想要的网站内容框架&#xff0c;以及部分诸如联系我们&#xff0c;About 等内页&#xff0c;但是在文章的发布上&#xff0c;则远不如Wordpress简便。而Wordpress尽管有各种模板&#xff0c;但修改又比较麻烦。解决方法…...

Next.js 学习笔记(七)——样式

样式 Next.js 支持不同的应用程序样式设计方法&#xff0c;包括&#xff1a; 全局 CSS&#xff1a;对于有传统 CSS 使用经验的人来说&#xff0c;使用简单且熟悉&#xff0c;但随着应用程序的增长&#xff0c;可能会导致 CSS 包过大&#xff0c;难以管理样式。CSS 模块&#…...

金线检测步骤

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

电池-电量监测基础知识

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

西瓜书学习笔记——层次聚类(公式推导+举例应用)

文章目录 算法介绍实验分析 算法介绍 层次聚类是一种将数据集划分为层次结构的聚类方法。它主要有两种策略&#xff1a;自底向上和自顶向下。 其中AGNES算法是一种自底向上聚类算法&#xff0c;用于将数据集划分为层次结构的聚类。算法的基本思想是从每个数据点开始&#xff0…...

深度视觉目标跟踪进展综述-论文笔记

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

【数据结构:顺序表】

文章目录 线性表顺序表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)是计算机存储、组织数据的方式&#xff0c;指相互之间存在一…...

android tts播报破音解决方案汇总

导航app引导中经常遇到破音&#xff0c;这里也将之前经历过的方案收集以下&#xff0c;方便以后选择&#xff1a; 1 对于开始和结尾破音&#xff1a; 可以用升降音来处理 两种方式 一种是 直接对开始和结束的时间段进行音量直接渐进改变。这里配的是200ms的渐变。 VolumeSha…...

使用分级同态加密防御梯度泄漏

抽象 联邦学习 &#xff08;FL&#xff09; 支持跨分布式客户端进行协作模型训练&#xff0c;而无需共享原始数据&#xff0c;这使其成为在互联和自动驾驶汽车 &#xff08;CAV&#xff09; 等领域保护隐私的机器学习的一种很有前途的方法。然而&#xff0c;最近的研究表明&…...

如何在看板中有效管理突发紧急任务

在看板中有效管理突发紧急任务需要&#xff1a;设立专门的紧急任务通道、重新调整任务优先级、保持适度的WIP&#xff08;Work-in-Progress&#xff09;弹性、优化任务处理流程、提高团队应对突发情况的敏捷性。其中&#xff0c;设立专门的紧急任务通道尤为重要&#xff0c;这能…...

P3 QT项目----记事本(3.8)

3.8 记事本项目总结 项目源码 1.main.cpp #include "widget.h" #include <QApplication> int main(int argc, char *argv[]) {QApplication a(argc, argv);Widget w;w.show();return a.exec(); } 2.widget.cpp #include "widget.h" #include &q…...

BCS 2025|百度副总裁陈洋:智能体在安全领域的应用实践

6月5日&#xff0c;2025全球数字经济大会数字安全主论坛暨北京网络安全大会在国家会议中心隆重开幕。百度副总裁陈洋受邀出席&#xff0c;并作《智能体在安全领域的应用实践》主题演讲&#xff0c;分享了在智能体在安全领域的突破性实践。他指出&#xff0c;百度通过将安全能力…...

OpenPrompt 和直接对提示词的嵌入向量进行训练有什么区别

OpenPrompt 和直接对提示词的嵌入向量进行训练有什么区别 直接训练提示词嵌入向量的核心区别 您提到的代码: prompt_embedding = initial_embedding.clone().requires_grad_(True) optimizer = torch.optim.Adam([prompt_embedding...

在WSL2的Ubuntu镜像中安装Docker

Docker官网链接: https://docs.docker.com/engine/install/ubuntu/ 1、运行以下命令卸载所有冲突的软件包&#xff1a; for pkg in docker.io docker-doc docker-compose docker-compose-v2 podman-docker containerd runc; do sudo apt-get remove $pkg; done2、设置Docker…...

Unity | AmplifyShaderEditor插件基础(第七集:平面波动shader)

目录 一、&#x1f44b;&#x1f3fb;前言 二、&#x1f608;sinx波动的基本原理 三、&#x1f608;波动起来 1.sinx节点介绍 2.vertexPosition 3.集成Vector3 a.节点Append b.连起来 4.波动起来 a.波动的原理 b.时间节点 c.sinx的处理 四、&#x1f30a;波动优化…...

人机融合智能 | “人智交互”跨学科新领域

本文系统地提出基于“以人为中心AI(HCAI)”理念的人-人工智能交互(人智交互)这一跨学科新领域及框架,定义人智交互领域的理念、基本理论和关键问题、方法、开发流程和参与团队等,阐述提出人智交互新领域的意义。然后,提出人智交互研究的三种新范式取向以及它们的意义。最后,总结…...

掌握 HTTP 请求:理解 cURL GET 语法

cURL 是一个强大的命令行工具&#xff0c;用于发送 HTTP 请求和与 Web 服务器交互。在 Web 开发和测试中&#xff0c;cURL 经常用于发送 GET 请求来获取服务器资源。本文将详细介绍 cURL GET 请求的语法和使用方法。 一、cURL 基本概念 cURL 是 "Client URL" 的缩写…...

MySQL 主从同步异常处理

阅读原文&#xff1a;https://www.xiaozaoshu.top/articles/mysql-m-s-update-pk MySQL 做双主&#xff0c;遇到的这个错误&#xff1a; Could not execute Update_rows event on table ... Error_code: 1032是 MySQL 主从复制时的经典错误之一&#xff0c;通常表示&#xff…...