当前位置: 首页 > 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…...

大话软工笔记—需求分析概述

需求分析&#xff0c;就是要对需求调研收集到的资料信息逐个地进行拆分、研究&#xff0c;从大量的不确定“需求”中确定出哪些需求最终要转换为确定的“功能需求”。 需求分析的作用非常重要&#xff0c;后续设计的依据主要来自于需求分析的成果&#xff0c;包括: 项目的目的…...

Python爬虫实战:研究feedparser库相关技术

1. 引言 1.1 研究背景与意义 在当今信息爆炸的时代,互联网上存在着海量的信息资源。RSS(Really Simple Syndication)作为一种标准化的信息聚合技术,被广泛用于网站内容的发布和订阅。通过 RSS,用户可以方便地获取网站更新的内容,而无需频繁访问各个网站。 然而,互联网…...

React Native在HarmonyOS 5.0阅读类应用开发中的实践

一、技术选型背景 随着HarmonyOS 5.0对Web兼容层的增强&#xff0c;React Native作为跨平台框架可通过重新编译ArkTS组件实现85%以上的代码复用率。阅读类应用具有UI复杂度低、数据流清晰的特点。 二、核心实现方案 1. 环境配置 &#xff08;1&#xff09;使用React Native…...

QT: `long long` 类型转换为 `QString` 2025.6.5

在 Qt 中&#xff0c;将 long long 类型转换为 QString 可以通过以下两种常用方法实现&#xff1a; 方法 1&#xff1a;使用 QString::number() 直接调用 QString 的静态方法 number()&#xff0c;将数值转换为字符串&#xff1a; long long value 1234567890123456789LL; …...

【C++从零实现Json-Rpc框架】第六弹 —— 服务端模块划分

一、项目背景回顾 前五弹完成了Json-Rpc协议解析、请求处理、客户端调用等基础模块搭建。 本弹重点聚焦于服务端的模块划分与架构设计&#xff0c;提升代码结构的可维护性与扩展性。 二、服务端模块设计目标 高内聚低耦合&#xff1a;各模块职责清晰&#xff0c;便于独立开发…...

Vite中定义@软链接

在webpack中可以直接通过符号表示src路径&#xff0c;但是vite中默认不可以。 如何实现&#xff1a; vite中提供了resolve.alias&#xff1a;通过别名在指向一个具体的路径 在vite.config.js中 import { join } from pathexport default defineConfig({plugins: [vue()],//…...

MySQL的pymysql操作

本章是MySQL的最后一章&#xff0c;MySQL到此完结&#xff0c;下一站Hadoop&#xff01;&#xff01;&#xff01; 这章很简单&#xff0c;完整代码在最后&#xff0c;详细讲解之前python课程里面也有&#xff0c;感兴趣的可以往前找一下 一、查询操作 我们需要打开pycharm …...

如何在Windows本机安装Python并确保与Python.NET兼容

✅作者简介&#xff1a;2022年博客新星 第八。热爱国学的Java后端开发者&#xff0c;修心和技术同步精进。 &#x1f34e;个人主页&#xff1a;Java Fans的博客 &#x1f34a;个人信条&#xff1a;不迁怒&#xff0c;不贰过。小知识&#xff0c;大智慧。 &#x1f49e;当前专栏…...

【记录坑点问题】IDEA运行:maven-resources-production:XX: OOM: Java heap space

问题&#xff1a;IDEA出现maven-resources-production:operation-service: java.lang.OutOfMemoryError: Java heap space 解决方案&#xff1a;将编译的堆内存增加一点 位置&#xff1a;设置setting-》构建菜单build-》编译器Complier...

联邦学习带宽资源分配

带宽资源分配是指在网络中如何合理分配有限的带宽资源&#xff0c;以满足各个通信任务和用户的需求&#xff0c;尤其是在多用户共享带宽的情况下&#xff0c;如何确保各个设备或用户的通信需求得到高效且公平的满足。带宽是网络中的一个重要资源&#xff0c;通常指的是单位时间…...