C++:继承

news/2024/12/29 6:16:16/

在这里插入图片描述

文章目录

  • 一.面向对象的三大特性之一:继承
    • 继承中的一些其他语法规定
  • 二.父类和子类间的对象赋值转换
  • 三.继承体系与类的默认成员函数--思维导图
  • 四.继承对象的内存模型
  • 五.继承的缺陷--菱形继承问题
    • 对于继承的认知

一.面向对象的三大特性之一:继承

  • 继承是类域层面上的层次划分,其语法设计的目的是为了提高代码的复用性(继承是对类整体的复用)同时令项目设计的层次划分更加清晰,现有如下场景:比如现在要设计两个类:Student类和Teacher类,然而这两个类包含了一些相同的成员(比如_name,_age以及一些相同的接口等等),于是我们便可以抽象出一个Person类(类中包含Student类和Teacher类中相同的成员),然后令Student类和Teacher类去继承Person类形成如下的类域层次:
    在这里插入图片描述
class Person
{
public:void Print(){cout << "name:" << _name << endl;cout << "age:" << _age << endl;}
private:string _name = "peter";int _age = 10;
};class Student : public Person
{
protected:int _stuid; // 学号
};class Teacher : public Person
{
protected:int _jobid; // 工号
};
  • 继承关系确定后,父类中的所有成员都会被继承到子类中.
  • 父类private成员子类中不能被访问的(但仍然存在于子类中,即实例化时会占用内存空间)
  • 继承方式分类与被继承的类成员在子类中的访问限定属性:
    在这里插入图片描述
  • 可以发现,父类的成员被继承后,其访问限定属性变化遵循"权限只缩小不扩大"的规律
  • 在继承体系中,子类和父类都有各自独立的作用域,当子类和父类中出现同名成员时,子类的成员会屏蔽对父类同名成员的直接访问(此时,若想访问父类中的同名成员,需要指定类域进行访问):
    在这里插入图片描述
  • 需要注意的是,如果父类和子类中出现重名的成员函数,则依然会形成上述的屏蔽关系不会构成函数重载

继承中的一些其他语法规定

  1. 友元关系不能继承,即父类的友元不能成为子类的友元
  2. 如果在父类中定义了stactic静态成员,则在整个继承体系中只存在一个该成员的实例

二.父类和子类间的对象赋值转换

  1. 子类对象可以赋值给父类的对象或者父类的引用.
  2. 子类对象的指针可以赋值给父类对象的指针.
    在这里插入图片描述
  • 上述赋值过程相当于将子类中的父类部分切割出来赋值给父类的对象(或引用或指针),可形象化如下:
    在这里插入图片描述
  • 该语法在继承体系的类对象间的拷贝赋值会用到
  • 父类对象不能赋值给子类对象(或引用),父类对象的指针不能赋值给子类对象的指针.

三.继承体系与类的默认成员函数–思维导图

在这里插入图片描述

四.继承对象的内存模型

在这里插入图片描述

  • Derive类对象的内存模型:
    在这里插入图片描述

五.继承的缺陷–菱形继承问题

  • 菱形继承关系图:
    在这里插入图片描述
  • 类代码:
class Person
{
public :string _name ; 
};
class Student : public Person
{
protected :int _num ; 
};
class Teacher : public Person
{
protected :int _id ; 
};
class Assistant : public Student, public Teacher
{
protected :string _majorCourse ; 
};
  • 菱形继承会导致同名成员变量重复在类中出现,造成二义性内存空间浪费的问题,上面的继承关系的内存模型:
    在这里插入图片描述
  • 为了解决菱形继承中数据冗余和二义性的问题,C++设计了虚继承的语法来弥补菱形继承的缺陷:菱形继承关系中,在含有重复子类中间子类的继承方式前加上virtual关键字:
    在这里插入图片描述
  • 经过virtual修饰后,Assistant类的内存模型会发生变化:
    在这里插入图片描述
  • 在实际工程中要避免设计出菱形继承的架构(一个子类继承多个父类的情况也要尽量避免),这是一个语法缺陷

对于继承的认知

  • 相对于直接将一个类作为另一个类的成员变量,继承一定程度上破坏了类之间的封装性,违背了软件工程架构设计思想中高内聚低耦合的原则(子类和父类间的依赖关系很强,耦合度高),因此能将一个类直接作为另一个类的成员变量时,优先考虑适配器形式的复用方式,其次再考虑使用继承语法,只有在需要引入多态的时候,继承才是必须的

在这里插入图片描述


http://www.ppmy.cn/news/175439.html

相关文章

基于Three.js和MindAR实现的网页端摄像头头部帽饰、头盔3D虚拟试穿戴功能(含源码)

前言 研究学习、使用Mind AR有一段时间了&#xff0c;发现它的虚拟试穿戴功能还是比较好玩的&#xff0c;对售卖头部佩戴相关产品的公司还是有一定的应用价值的。例如&#xff1a;耳环、口罩、眼镜、头盔和帽子等都是适用的。 于是我收集了很多头部佩戴相关的3D模型进行测试&a…

iframe跨框架脚本攻击,安全问题解决办法

跨框架脚本(XFS)漏洞使攻击者能够在恶意页面的 HTMLiframe 标记内加载易受攻击的应用程序。攻击者可以使用此漏洞设计点击劫持攻击&#xff0c;以实施钓鱼式攻击、框架探查攻击、社会工程攻击或跨站点请求伪造攻击。个人理解就是其他网站会在他的iframe中调用我的网站内容&…

网络层:地址解析协议ARP

网络层&#xff1a;地址解析协议ARP 笔记来源&#xff1a; 湖科大教书匠&#xff1a;ARP协议 声明&#xff1a;该学习笔记来自湖科大教书匠&#xff0c;笔记仅做学习参考 B知道C的IP地址但如果不知道其对应的MAC地址&#xff0c;就无法将数据包发送给C&#xff0c;如何解决这个…

istio证书异常

istio有时会出现证书异常的问题&#xff0c;例如证书校验失败&#xff0c;证书过期等&#xff0c;此时需要我们手动处理istio证书问题。 一、我的istio版本 client version: 1.3.3 control plane version: 1.3.3二、开始处理 1、先查询istio的密钥istio-ca-secret&#xff1a…

学习韩语字母表 - 24小时快速学会韩语口语发音

韩语字母表由21个元音和19个辅音组成&#xff0c;可以组成许多音节。它既简单又具系统性&#xff0c;能全面的记录韩语的语音。 本软件涵盖最全的字母发音表&#xff0c;同时附带相对应字母例句&#xff0c;提供听力训练&#xff0c;让初学者在最短的时间内快速掌握韩语发音。 …

柯桥韩语学习,怎样学好韩语呢

柯桥韩语学习&#xff0c;怎样学好韩语呢&#xff0c;怎样开始学韩语呢 最近很多咨询韩语课程同学问了比较多的问题&#xff0c;现在简单给大家讲解下 怎样学好韩语呢 零基础的韩语学习者先要掌握韩语字母的发音&#xff0c;建议可以报一个韩语辅导班或者在线上学习一段时间。…

Emacs之magit提交代码(一百零八)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 优质专栏&#xff1a;Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 人生格言&#xff1a; 人生…

韩语翻译入门

在语言学习中&#xff0c;韩语算得上现在比较常见的语言了&#xff0c;而不同语言之间都有不同&#xff0c;同时也会对翻译产生很大的影响。那么怎么做好韩语的翻译呢&#xff1f;从业20年的专业翻译公司“彼岸译云”跟你分享一些关于韩语翻译的经验。 一、韩语特点 韩语与汉语…