news 2026/8/5 12:40:31

C++学习:封装,继承和多态

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
C++学习:封装,继承和多态

封装,继承和多态

  • 封装
    • 类是封装的核心
  • 继承
    • 继承方式和访问限定符
    • 继承规则
    • 继承的问题
    • 继承还是组合
  • 多态
    • 编译时多态和运行时多态
    • 虚函数
    • 纯虚函数和抽象类
    • 了解
  • 概念理解

封装

类是封装的核心

类通过成员变量成员函数数据和功能绑定,通过访问限定符实现访问权限控制,至此每一个类都实现特定功能,都是一个模块,相互解耦

继承

继承方式和访问限定符

基类的访问限定符和派生类的继承方式共同决定继承得来的成员的访问权限

继承规则

  • 隐藏关系

当基类成员和派生类成员同名会构成隐藏关系,基类同名成员会被隐藏

  • 派生类对象可以赋值给基类指针/引用/对象
    基类对象不可赋值给派生类指针/引用/对象
Student stu;//派生类Person pp=stu;//相当于从派生类对象分割出基类对象Person*p1=&stu;Person&p2=stu;
  • 派生类构造和析构

派生类构造需要调用基类构造函数,若无默认构造则需要在初始化列表中显示调用基类拷贝构造需要在初始化列表中调用)

Student(Student&stu):Person(stu){//深拷贝}

派生类析构
函数调用顺序:

构造时:派生类初始化可能依赖基类成员,需要先初始化基类才能使用基类方法

析构时:派生类析构可能依赖基类成员,需要先进行派生类析构,防止基类先析构导致访问出错

  • 友缘关系不可继承

基类的友缘不可直接访问派生类的私有和保护成员

  • 基类定义static变量全局唯一

无论有多少派生类,在继承体系中只有唯一一个static实例

继承的问题

  • 菱形继承

在多继承场景下,可能会出现这种场景:

此时会出现数据冗余和二义性:1.Assistant会有多个Person对象 2.两个Person类需要确定操作对象

解决方法:

  1. 采用以下形式进行指定对象(数据冗余为解决)
a.Student::_name="yyy";a.Teacher::_name="xxx";
  1. 虚继承
classStudent:virtualpublicPerson
虚继承会将公共类单独放置,最后调用构造

继承还是组合

继承:内部可见,依赖程度高,耦合度高
组合:内部不可见,依赖程度低,耦合度低
就比如一个基类,有90个私有成员,10个公有成员,如果采用继承,内存中会包含所有基类成员,基类发生修改可能会影响到派生类;组合只会感知到这10个成员,围绕着这10个成员访问,耦合度降低。

多态

编译时多态和运行时多态

  • 编译时多态
    函数重载和函数模版(实参传参进行参数匹配是在编译时进行的)

  • 运行时多态
    对于某一行为(函数),传入不同参数完成不同行为

条件:
1.必须是基类的指针或者引用调用虚函数
2.被调函数必须是虚函数,并且完成虚函数的重写/覆盖

虚函数

虚函数是实现运行时多态的基础,对虚函数进行重写,从而达到多态

virtualvoidfunc(){}//虚函数
  • 虚函数表和虚函数表指针

对于存在虚函数(virtual)的类,会生成一张虚函数表,虚函数表中会记录所有虚函数地址,同类对象会共用一张虚函数表;派生类会继承基类的虚函数表,并对重写的虚函数进行地址覆盖,添加派生类虚函数地址

虚函数表指针则是指向虚函数表的指针:传入不同参数完成不同实现(多态的实现)是通过调用传入参数的虚函数表指针所指向不同虚表对应函数实现的

注:析构函数在编译时会统一命名为destructor导致派生类析构和基类析构形成隐藏关系,一般需要加上virtual

纯虚函数和抽象类

包含纯虚函数的类为抽象类,纯虚函数一般不需要定义,因为抽象类不可实例化

classConnnect{public:vritualvoidfunc()=0;//函数定义后=0表示虚函数};

了解

  • 多态控制

override:希望多态重写没有报错(如名字拼写错误)
final:不允许重写虚函数

概念理解

  • 重载

1.在同一作用域
2.函数名相同,参数不同,参数个数或类型不同,返回值同或不同

  • 重写/覆盖

1.函数分别在基类和派生类两个不同的作用域中
2.函数名,参数,返回值都相同,协变例外
3.函数必须为虚函数

  • 隐藏

1.函数分别在基类和派生类两个不同的作用域中
2.函数名相同
3.不是重写就是隐藏
4.基类和派生类的同名成员变量也构成隐藏关系

没有形成多态,同名函数构成隐藏,基类指针只会调用基类成员函数,派生类指针只会调用派生类成员函数

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/8/5 12:39:47

肇庆市网站建设如何从零开始打造高转化率的本地企业官网全攻略

做企业,尤其是做本地实体企业,现在最头疼的事情是什么?不是产品不好,也不是服务不行,而是“酒香也怕巷子深”。在肇庆这片充满活力的土地上,无论是端州区的老字号餐饮,还是高要区的制造业工厂,亦或是鼎湖区的生态旅游项目,大家都渴望被更多人看见。而在这个数字化时代…

作者头像 李华
网站建设 2026/8/5 12:39:59

可白嫖源码---课程设计--毕业设计--springboot高校学科竞赛管理系统[编号:project18952](案例分析)-附源码

本文仅展示核心实现逻辑与部分代码片段,完整项目源码、配套文档、数据库脚本内容较多,篇幅有限无法全部放出。 有需要完整资源的同学,可以在评论区留言【资料或领源码】,我会一 一回复站内私信,发送完整文件摘 要本系…

作者头像 李华
网站建设 2026/8/5 12:39:00

162、YOLOv8改进实战:Transformer Decoder检测头替换——DETR风格端到端检测实现

162、YOLOv8改进实战:Transformer Decoder检测头替换——DETR风格端到端检测实现 从一次线上事故说起 去年年底,我在一个工业质检项目上栽了个大跟头。客户要求检测流水线上微小划痕,YOLOv8 baseline跑下来mAP有0.78,看起来还行。但部署到产线后,每天凌晨三点准时出现大…

作者头像 李华
网站建设 2026/8/5 12:36:00

揭秘公司网站建设流程:从0到1打造高转化官网的实战指南

在这个数字化浪潮席卷全球的今天,如果你还觉得拥有一个网站只是为了“有个面子”,那真的就太落伍了。现在的企业,尤其是中小型企业,网站早就不是简单的线上名片,而是24小时不休息的销售冠军,是品牌信任度的背书,更是获取精准流量的核心阵地。但是,很多老板或者市场负责…

作者头像 李华
网站建设 2026/8/5 12:36:06

文件上传漏洞攻防:从CTF实战到企业级安全方案

1. 从两道CTF题看文件上传漏洞的攻防本质最近在复盘一些经典的CTF题目,特别是Web安全方向的,发现“文件上传”这个考点真是经久不衰。今天想结合[极客大挑战 2019]Upload1和[ACTF2020新生赛]Upload1这两道题,来深入聊聊文件上传漏洞那些事儿。…

作者头像 李华