深入解析:从C++开始的编程生活(16)——继承

news/2026/1/19 19:32:14/文章来源:https://www.cnblogs.com/yangykaifa/p/19503523

前言

本系列文章承接C语言的学习,需要有C语言的基础才能学会哦~
第16篇主要讲的是有关于C++的继承
C++已经进入进阶,加油!!

目录

前言

继承

普通类继承

语法

子类访问父类成员的访问限定符限制

继承类模板

基类与派生类之间的转换

继承的隐藏作用域

派生类的默认成员函数

构造函数

拷贝构造

析构函数

继承与友元

继承和静态成员

单继承、多继承和菱形继承

虚继承virtual

多继承的指针偏移

继承和组合


继承

是实现面向对象编程的复用代码的一个重要手段。

当两个类有重复的功能或函数时,就把这些重复功能创建为父类,让这两个类去继承父类。这样一来,这两个类只用写独自独特的成员函数,重复部分都复用父类的代码即可。

普通类继承

语法

//父类(基类)
class person
{
public:str _name;int _number;
}
//子类(派生类)
class Student: public person
{
public:string _class;
}

此处student类public方式继承于person类,student就也有父类的成员了。

子类访问父类成员的访问限定符限制
类成员/继承方式public继承protected继承private继承
基类的public成员派生类public成员派生类protected成员派生类private成员
基类的protected成员派生类protected成员派生类protected成员派生类private成员
基类的private成员派生类中不可见派生类中不可见派生类中不可见

①可父类成员在子类中的访问方式取决于谁的限定符限制更大。比如基类protected和子类private继承,private限制大,所以就能访问方式为private,此时可以访问基类的protected和public成员。
②父类的private成员,无论如何都无法被子类直接使用。只能靠调用父类的为被限制的函数进行访问。
③使用class则默认为private继承,使用struct则默认为public继承。

继承类模板

当基类是类模板时,需要指定类域。

因为模板是按需实例化,还未被使用的父类成员函数由于未实例化,无法被找到,编译会报错,所以要指明类域来避免这种错误。

同样的,如果父类有内部类,也要注意是否被实例化的问题。

基类与派生类之间的转换

①public继承的派生类对象可以赋值给基类的指针/引用。(也叫赋值兼容转换)

Student sobj;
Person *pp = &sobj;
Person &rp = sobj;

把sobj赋值给了Person类指针/引用,这时我们使用这些指针/引用时就不会访问到sobj的独有成员。

这种操作也叫做切片、切割。

②但是基类对象不可以赋值给派生类对象。

继承的隐藏作用域

若子类和父类有同名的成员,访问时默认优先访问最近类域中的成员,我们也可以自行指明类域来访问。

那么不访问的同名成员,就会被隐藏,这些同名的成员构成隐藏关系。

被隐藏的成员无法被使用。

class A
{
public:void fun(){cout << "Hi" << endl;}
};
class B : public A
{
public:void fun(int i){cout <<"int i" << endl;}
};

此处A类的fun被隐藏,若要使用A的fun函数,就要指定类域来使用。

派生类的默认成员函数

构造函数

派生类的默认构造,最好要自己写。对继承的父类成员,我们要用父类的构造函数进行构造。

class Person
{
public:Person(const char* name):_name(name){}
protected:string _name;
};
class Student : public Person
{
public:Student(int num, const char* address, const char* name):_num(num),_address(address),Person(name)//父类成员使用父类的构造。{}
protected:int _num;string _address;
};

父类的部分,我们把它们看作一个整体,统一走父类的构造函数来构造。

注意格式哦!

ps:若某类的默认构造为私有的,那么这个类将无法被继承。
或者被final修饰之后就不可以被继承了(关键词final在C++11支持)。

拷贝构造

一般使用默认生成的拷贝即可。同样的,父类的成员要调用父类的拷贝构造。默认生成的拷贝是浅拷贝,如果不能满足需要就要自己写一个深拷贝的拷贝构造。

要注意的是,子类的赋值运算符重载要用到父类的赋值运算符重载,父类的赋值运算符重载会被隐藏,需要指定类域来使用。

析构函数

一般用默认生成的析构即可。顺序是先析构子类,再析构父类。

当我们自己写析构函数的时候,要注意不用显示调用父类的析构时。
在默认情况下,父类的析构函数与子类的构成隐藏关系,这是规定,详细原因再有关多态的部分可以讲。

继承与友元

一句话概括,友元关系不可以继承。

继承和静态成员

一句话概括,父类和子类共用父类的静态成员

单继承、多继承和菱形继承

语法:

class Assistant:public Student,public Teacher

单继承:一个子类只有一个直接父类。


多继承:一个子类(C)有两个或以上的直接父类(A、B)。


菱形继承:某子类(D)间接多次继承同一个基类(A)。

此时因为D间接继承了两次父类A,所有会有两份父类A的成员,导致数据冗余。

多继承和菱形继承会造成数据冗余和二义性(若有同名变量可能会不发辨别是哪个类的变量,或者这个变量是哪个父类或者哪个子类的),即使二义性可以靠指定类域解决,但是数据冗余的问题无法解决。

虚继承virtual

用于解决菱形继承的二义性和数据冗余的问题。

用关键字virtual修饰菱形腰部的类(上图的B、C),编译时就只会保留一份数据。

了解即可,实际上最好不要使用多继承,即使使用多继承,也最好不要出现菱形继承的情况。

多继承的指针偏移

//D多继承于B1和B2
class B1 { public: int _b1;};
class B2 { public: int _b2;};
class D : public B1, public B2 { public: int _d;};
int main()
{D d;B1* p1 = &d;B2* p2 = &d;D* p3 = &d;return 0;
}

三个指针都用&d来赋值,但是p1 == p3 != p2。

可以用赋值兼容转换的切割来解释。
如图

p1和p2只能指向d继承父类的部分,p1指向B1部分,p2指向B2部分。而且,虽然p1 == p3但是两个指针的含义也是不同的,p1是对继承父类B1的切片,p3指向的是整个D。

继承和组合

继承是is-a的关系(如Student类继承于Person类,即Student is a Person)。
组合是has-a的关系(如Car类有Seat类的成员,即Car has a Seat)。

两者都对代码进行了复用,能够提高开发效率。
不同的是:

特性/复用方式继承(白箱复用)组合(黑箱复用)
可见性父类的成员对子类可见内部细节不可见
封装性破坏基类封装,派生类依赖基类实现保持类的封装,组合类依赖接口而非实现
耦合性高耦合低耦合

白箱和黑箱是相对于可见性而言的,白箱可见细节,黑箱不可见细节。

耦合性高的代码,每个部分环环相扣,如果某处出错或者进行修改,就会牵一发而动全身,这对代码的维护工作来说是不利的。

因此,实际应用中尽量使用组合,主要还是看类与类之间的关系。如果是更符合is-a关系,就用继承;如果更符合has-a关系,就用组合;如果两者都符合(比如链表和栈),那就优先使用组合。

❤~~本文完结!!感谢观看!!接下来更精彩!!欢迎来我博客做客~~❤

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

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

相关文章

13.6B参数铸就“世界模型”,美团LongCat-Video搭建5分钟原生视频生成,定义AI视频新标杆

13.6B参数铸就“世界模型”,美团LongCat-Video搭建5分钟原生视频生成,定义AI视频新标杆pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !importan…

NodeJS生产环境发布流程

NodeJS生产环境发布流程1、创建宝塔的容器时,先把命令设置为sleep infinity,使用npm将依赖安装完后再改为node /app/server.js2,如果.env不生效,则直接在容器的环境变量里设置3、容器数据库里的端口应该设置为3306…

怎样免费在线把 HEIC 转为 JPG?无需安装软件,也不用上传照片

如果你用 iPhone 拍照,可能已经注意到一个新格式:HEIC。它画质高、文件小,而且在苹果设备上支持良好。但在日常使用中,你可能会遇到不少麻烦。1️⃣ HEIC 的最大问题:兼容性不足 虽然 HEIC 技术先进,但在非苹果环…

2026年趋势全景图:AI重塑技术与翻译行业,这些变化你必须知道!

哈喽,大家好!2026年已至,最近不少机构都发布了年度趋势报告——从IBM聚焦的企业战略,到CSA Research关注的翻译行业,再到BOL News、CSDN拆解的技术革新,每一份报告都在告诉我们:这一年,“不确定性”会是常态,但“机遇”也藏在每一个变革节点里。 今天这篇博客,我就整…

人工智能标注工程师证书:超越标注之框,赋能技能跃迁

在人工智能迅速发展的今天&#xff0c;标注工程师这个职业角色正在悄然发生转变。曾经&#xff0c;我们被称为“数据标注师”&#xff0c;任务是机械地画框、分类、打标签。但人工智能的出现&#xff0c;推动标注工程师职业发生深刻的变化&#xff0c;因此&#xff0c;这也为我…

考完PMP这几件事一定要做!

各位刚查到 PMP 成绩的小伙伴们&#xff0c;恭喜大家顺利通关呀&#xff01;学长知道你们现在肯定又激动又迷茫&#xff0c;拿到证书只是第一步&#xff0c;怎么让它真正成为职业路上的 “硬通货” 才是关键&#xff5e; 2026 年各地政策福利又升级了&#xff0c;这 4 件事抓紧…

竞品关键词实战指南:从挖掘到落地,抢占搜索流量高地

在当今的数字营销领域&#xff0c;搜索流量是品牌获取曝光、转化客户的核心阵地之一。而竞品关键词&#xff0c;作为已经在市场中被验证有效的搜索术语&#xff0c;就像一把打开流量宝库的钥匙。它们不仅能帮助我们洞悉用户需求、发现内容漏洞&#xff0c;更能让我们在自然搜索…

应届生找工作选Java后端方向!未来发展路线该如何走?未来职业发展怎么走?

&#xfeff;应届生找工作选Java后端方向&#xff01;未来发展路线该如何走?未来职业发展怎么走&#xff1f; 应届生选择Java后端方向是个明智的选择&#xff01;以下是我为你梳理的清晰发展路线&#xff0c;分阶段帮你规划职业成长&#xff1a; 一、入门阶段&#xff08;0-2…

深入解析Excel数组:从基础概念到高阶应用的完全指南

数组是Excel函数进阶的钥匙&#xff0c;掌握数组运算逻辑能让你的数据处理能力提升一个维度。 一、理解数组&#xff1a;Excel中的“数据容器” 数组是Excel中最强大的概念之一&#xff0c;它允许你将多个值作为一个整体来处理。本质上&#xff0c;数组就是一个有序的数据集合…

参考文献怎么找:高效查找参考文献的实用方法与技巧

做科研的第一道坎&#xff0c;往往不是做实验&#xff0c;也不是写论文&#xff0c;而是——找文献。 很多新手科研小白会陷入一个怪圈&#xff1a;在知网、Google Scholar 上不断换关键词&#xff0c;结果要么信息过载&#xff0c;要么完全抓不到重点。今天分享几个长期使用的…

不足4个百分点!华为智驾“逼近”英伟达

智驾计算平台之争&#xff0c;进入白热化阶段。一方面&#xff0c;没有自研芯片的辅助驾驶方案提供商尝试打通市场主流计算平台&#xff0c;从而满足不同车企的需求&#xff1b;另一方面&#xff0c;以自研芯片算法打造全栈方案的玩家&#xff0c;也在争夺市场主动权。去年底&a…

Java程序员如何突击即将来临的春招?该做哪些技术储备? - 教程

Java程序员如何突击即将来临的春招?该做哪些技术储备? - 教程pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Co…

数据(数据分析与大数据开发)的地位与作用?

数据&#xff08;数据分析与大数据开发&#xff09;的地位与作用&#xff1f; 数据分析与大数据开发的地位与作用 1. 核心地位 数据分析与大数据开发已成为现代社会的基础设施级技术&#xff0c;其地位体现在&#xff1a; 决策支持&#xff1a;为政府、企业提供基于数据的决…

连续3个月破10万!华为乾崑今年目标300万台

高工智能汽车研究院发布最新报告显示&#xff0c;今年1-11月&#xff0c;中国市场&#xff08;不含进出口&#xff09;乘用车前装标配NOA&#xff08;含高速、城区&#xff09;交付新车499.57万辆&#xff0c;同比大幅增长171.09%&#xff0c;前装搭载率提升至24.13%。其中&…

温州精密机械工厂10个SolidWorks设计画图共享一套SolidWorks

在温州精密机械制造行业&#xff0c;SolidWorks作为主流三维设计软件的高效应用直接关系到企业研发效率与市场竞争力。针对中小型精密机械工厂普遍面临的"10人设计团队共享一套SolidWorks"的资源配置难题&#xff0c;需要从技术实现、流程优化到管理策略进行系统性解…

UI-TARS-desktop实战:用自然语言轻松操控电脑任务

UI-TARS-desktop实战&#xff1a;用自然语言轻松操控电脑任务 1. 引言&#xff1a;从命令行到自然语言的交互革命 随着人工智能技术的发展&#xff0c;人机交互方式正在经历深刻变革。传统的图形用户界面&#xff08;GUI&#xff09;操作依赖鼠标与键盘的精确控制&#xff0c…

学术搜索引擎:高效获取学术资源的必备工具与使用指南

做科研的第一道坎&#xff0c;往往不是做实验&#xff0c;也不是写论文&#xff0c;而是——找文献。 很多新手科研小白会陷入一个怪圈&#xff1a;在知网、Google Scholar 上不断换关键词&#xff0c;结果要么信息过载&#xff0c;要么完全抓不到重点。今天分享几个长期使用的…

导师严选 2026 毕业论文必备的8款AI论文软件测评

导师严选 2026 毕业论文必备的8款AI论文软件测评 2026年毕业论文写作工具测评&#xff1a;为何需要一份权威榜单&#xff1f; 随着人工智能技术的不断进步&#xff0c;AI论文辅助工具已成为高校学生提升写作效率、优化内容质量的重要助手。然而&#xff0c;面对市场上琳琅满目的…

环境监测仪器:认识十要素微气象仪

随着环境监测技术的发展&#xff0c;集成化微型气象仪已逐渐应用于气象、城市环境、交通、能源等多个领域。这类设备能够同时采集多项气象与环境参数&#xff0c;为实时监测与分析提供支持。十要素微气象仪是一款集成了空气温度、湿度、大气压力、风速、风向、PM2.5、PM10、噪声…

SolidWorks—山东某非标设计工厂1台主机共享给8个研发用

在山东某非标设计工厂中&#xff0c;工程师们面临着如何高效利用有限硬件资源的问题。SolidWorks作为三维机械设计的主流软件&#xff0c;对计算机性能有着较高要求&#xff0c;而传统的一人一机模式往往导致硬件资源闲置或分配不均。经过实践探索&#xff0c;该工厂成功实现了…