11月第一篇新作,十一月对我好一点:C++之继承(2)

C++之继承(2)

在这里插入图片描述

虚继承

很多⼈说C++语法复杂,其实多继承就是⼀个体现。有了多继承,就存在菱形继承,有了菱形继承就有 菱形虚拟继承,底层实现就很复杂,性能也会有⼀些损失,所以最好不要设计出菱形继承。多继承可 以认为是C++的缺陷之⼀,后来的⼀些编程语⾔都没有多继承,如Java。

 class Person
 {
 public:
 string _name; // 姓名
 
/*int _tel;
 int _age;
 string _gender;
 string _address;*/
 // ...
 };
 // 使⽤虚继承Person类
 
class Student : virtual public Person
 {
 protected:
 int _num; //学号
 
};
 // 使⽤虚继承Person类
 
class Teacher : virtual public Person
 {
 protected:
 int _id; // 职⼯编号
 
};
 // 教授助理
 
class Assistant : public Student, public Teacher
 {
 protected:
 string _majorCourse; // 主修课程
 
};
 int main()
 {
 // 使⽤虚继承,可以解决数据冗余和⼆义性
 
Assistant a;
 a._name = "peter";
 return 0;
 }

我们可以设计出多继承,但是不建议设计出菱形继承,因为菱形虚拟继承以后,⽆论是使⽤还是底层 都会复杂很多。当然有多继承语法⽀持,就⼀定存在会设计出菱形继承,像Java是不⽀持多继承的, 就避开了菱形继承。

class Person
 {
 public:
 Person(const char* name)
 :_name(name)
{}
        string _name; // 姓名
};
 class Student : virtual public Person
 {
 public:
        Student(const char* name, int num)
                :Person(name)
                ,_num(num)
        {}
 protected:
        int _num; //学号
 };
 class Teacher : virtual public Person
 {
 public:
        Teacher(const char* name, int id)
                :Person(name)
                , _id(id)
        {}
 protected:
        int _id; // 职⼯编号
 };
 // 不要去玩菱形继承
class Assistant : public Student, public Teacher
 {
 public:
        Assistant(const char* name1, const char* name2, const char* name3)
                :Person(name3)
                ,Student(name1, 1)
                ,Teacher(name2, 2)
        {}
 protected:
        string _majorCourse; // 主修课程
};
 int main()
 {
        // 思考⼀下这⾥a对象_name是"张三", "李四", "王五"中的哪⼀个?        
     Assistant a("张三", "李四", "王五");
     //王五
        return 0;
 }

多继承中指针偏移问题?下⾯说法正确的是()

A:p1 == p2 == p3 B:p1<p2<p3 C:p1==p3!=p2 D:p1!=p2!=p3

 class Base1 {  public:  int _b1; };
 class Base2 {  public:  int _b2; };
 class Derive : public Base1, public Base2 { public: int _d; };
 int main()
 {
 Derive d;
 Base1* p1 = &d;
 Base2* p2 = &d;
 Derive* p3 = &d;
 }
 return 0;

在这里插入图片描述

Derive继承了Base1和Base2,编译器非常聪明,会进行切片,所以p2和p1,p3指向的不一样。

继承和组合

• public继承是⼀种is-a的关系。也就是说每个派⽣类对象都是⼀个基类对象。

• 组合是⼀种has-a的关系。假设B组合了A,每个B对象中都有⼀个A对象。

• 继承允许你根据基类的实现来定义派⽣类的实现。这种通过⽣成派⽣类的复⽤通常被称为⽩箱复⽤ (white-box reuse)。术语“⽩箱”是相对可视性⽽⾔:在继承⽅式中,基类的内部细节对派⽣类可 ⻅。继承⼀定程度破坏了基类的封装,基类的改变,对派⽣类有很⼤的影响。派⽣类和基类间的依 赖关系很强,耦合度⾼。

• 对象组合是类继承之外的另⼀种复⽤选择。新的更复杂的功能可以通过组装或组合对象来获得。对 象组合要求被组合的对象具有良好定义的接⼝。这种复⽤⻛格被称为⿊箱复⽤(black-boxreuse), 因为对象的内部细节是不可⻅的。对象只以“⿊箱”的形式出现。组合类之间没有很强的依赖关 系,耦合度低。优先使⽤对象组合有助于你保持每个类被封装。

• 优先使⽤组合,⽽不是继承。实际尽量多去⽤组合,组合的耦合度低,代码维护性好。不过也不太 那么绝对,类之间的关系就适合继承(is-a)那就⽤继承,另外要实现多态,也必须要继承。类之间的 关系既适合⽤继承(is-a)也适合组合(has-a),就⽤组合。

在这里插入图片描述

我们平常更希望用组合而不是继承,这里我们需要知道耦合和内聚的概念,我们举个例子,高耦合有点像班级一起游玩,什么都要听从老师的指挥,受到限制较多;

组合就相对于还好,受到的限制还好,因为牵连性小了,不会动一发而触全身

mg-UeT2bGin-1730450235453)]

我们平常更希望用组合而不是继承,这里我们需要知道耦合和内聚的概念,我们举个例子,高耦合有点像班级一起游玩,什么都要听从老师的指挥,受到限制较多;

组合就相对于还好,受到的限制还好,因为牵连性小了,不会动一发而触全身

再来打个比方,玫瑰和植物的关系相当于is-a,轮胎和汽车的关系相当于has-a

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

uni-app 封装图表功能

文章目录 需求分析1. 秋云 uchars2. Echarts 需求 在 uni-app 中使用图表功能&#xff0c;两种推荐的图表工具 分析 在 Dcloud市场 搜索Echarts关键词&#xff0c;会出现几款图表工具&#xff0c;通过大家的下载量&#xff0c;可以看到秋云这个库是比较受欢迎的&#xff0c;其…

FemtoMega的开发者模式教程

1.FemtoMega相机简介 Femto Mega作为奥比中光联合微软、英伟达共同推出的全新升级iToF相机&#xff0c;整合英伟达算力及微软深度引擎技术&#xff0c;整机具备高通用性优势&#xff0c;集成深度算力无需额外算力&#xff0c;此外还支持POE网络接口&#xff0c;支持远程的部署和…

基于SpringBoot的健身房系统的设计与实现(源码+定制+开发)

博主介绍&#xff1a; ✌我是阿龙&#xff0c;一名专注于Java技术领域的程序员&#xff0c;全网拥有10W粉丝。作为CSDN特邀作者、博客专家、新星计划导师&#xff0c;我在计算机毕业设计开发方面积累了丰富的经验。同时&#xff0c;我也是掘金、华为云、阿里云、InfoQ等平台…

索引的使用以及使用索引优化sql

索引就是一种快速查询和检索数据的数据结构&#xff0c;mysql中的索引结构有&#xff1a;B树和Hash。 索引的作用就相当于目录的作用&#xff0c;我么只需先去目录里面查找字的位置&#xff0c;然后回家诶翻到那一页就行了&#xff0c;这样查找非常快&#xff0c; 一、索引的使…

Dockerfile 增强新语法

Dockerfile 是使用 Docker 的相关开发人员的基本工具&#xff0c;用来充当构建 Docker 镜像的模板&#xff0c;在这个文件中包含用户可以在命令行上调用来构建镜像的所有命令。了解并有效利用 Dockerfile 可以显着简化开发流程&#xff0c;实现镜像创建的自动化并确保不同开发阶…

【搜索引擎】俄罗斯搜索引擎yandex

俄罗斯搜索引擎yandex 1997年&#xff0c;俄罗斯搜索引擎Yandex&#xff08;俄语意为&#xff1a;语言目录&#xff09;首次上线&#xff0c;已发展成为全球第四大搜索引擎和第二大非英语搜索引擎 https://yandex.com/

Vue v-on

vue : v-on:func --------------------------- data(){ return{ prop:any; } } methods:{ func(){ } } template:, v-on

【django】django RESTFramework前后端分离框架快速入门

目录 一、搭建项目开发环境 1.1 pycharm创建项目 1.2 修改配置settings.py 1.3 新增 static与staticfiles文件夹 1.4 生成数据表 1.5 创建超级用户 1.6 启动项目 二、安装REST_Framework 2.1 安装 2.2 配置settings 2.3 重新执行生成数据库脚本 三、修改路由 四、s…

基于centos7.9搭建MariaDB10.5高可用集群

MariaDB-HA 环境初始化安装MariaDB配置集群 基于centos7.9搭建MariaDB10.5数据库高可用集群&#xff0c;对标mysql5.7 节点IPnode1192.168.200.101node2192.168.200.102node3192.168.200.103 环境初始化 #!/bin/bash# 定义节点信息 NODES("192.168.200.101 node1"…

WAF+AI结合,雷池社区版的强大防守能力

网上攻击无处不不在&#xff0c;为了保护我自己的网站&#xff0c;搜索安装了一个开源免费的WAF 刚安装完成就收到了海外的攻击&#xff0c;看到是海外的自动化攻击工具做的 雷池刚好也有AI分析&#xff0c;于是就尝试使用这个功能&#xff0c;看看这个ai能力到底怎么样 以下…

服务器宝塔安装哪吒监控

哪吒文档地址&#xff1a;https://nezha.wiki/guide/dashboard.html 一、准备工作 OAuth : 我使用的gitee&#xff0c;github偶尔无法访问&#xff0c;不是很方便。第一次用了极狐GitLab&#xff0c;没注意&#xff0c;结果是使用90天&#xff0c;90天后gg了&#xff0c;无法登…

ThingsBoard规则链节点:Math Function节点详解

引言 1. Math Function 节点简介 2. 节点配置 2.1 基本配置示例 3. 使用场景 3.1 数据预处理 3.2 阈值判断 3.3 复杂计算 3.4 动态阈值 4. 实际项目中的应用 4.1 项目背景 4.2 项目需求 4.3 实现步骤 5. 总结 引言 ThingsBoard 是一个开源的物联网平台&#xff0c…

Spark入门到实践

Spark入门到实践 一、Spark 快速入门1.1 Spark 概述1.2 Spark 最简安装1.3 Spark实现WordCount1.3.1 下载安装Scala1.3.2 添加Spark依赖1.3.3 Scala实现WordCount1.3.4 通过IDEA运行WordCount1.3.5 IDEA配置WordCount输入与输出路径1.3.6 通过IDEA运行WordCount1.3.7 查看运行结…

.NET 9 AOT的突破 - 支持老旧Win7与XP环境

引言 随着技术的不断进步&#xff0c;微软的.NET 框架在每次迭代中都带来了令人惊喜的新特性。在.NET 9 版本中&#xff0c;一个特别引人注目的亮点是 AOT&#xff08; Ahead-of-Time&#xff09;支持&#xff0c;它允许开发人员将应用程序在编译阶段就优化为能够在老旧的 Win…

网络层之IP协议,它带来了哪些功能,真的能顺着网线找到?

前言 在上一篇&#xff0c;学习了链路层的以太网协议&#xff0c;知道了MAC地址&#xff0c;在以太网中&#xff0c;找到对应的终端最终依靠的是MAC地址&#xff0c;但是在实际使用中&#xff0c;大家可能发现并不是使用的MAC地址&#xff0c;而是IP协议&#xff0c;比如 &…

linux之网络子系统- 内核发送数据包流程以及相关实际问题

一、相关实际问题 查看内核发送数据消耗的CPU时应该看sy还是si在服务器上查看/proc/softirqs&#xff0c;为什么NET_RX要比NET_TX大得多发送网络数据的时候都涉及那些内存拷贝操作零拷贝到底是怎么回事为什么Kafka的网络性能很突出 二、网络包发送过程总览 调用系统调用send发…

使用WebStorm开发Vue3项目

记录一下使用WebStorm开发Vu3项目时的配置 现在WebStorm可以个人免费使用啦&#xff01;&#x1f929; 基本配置 打包工具&#xff1a;Vite 前端框架&#xff1a;ElementPlus 开发语言&#xff1a;Vue3、TypeScript、Sass 代码检查&#xff1a;ESLint、Prettier IDE&#xf…

操作系统及MySQL管理系统客户端的介绍

操作系统 1、Windows&#xff1a; 图形化管理工具&#xff1a;如控制面板、设置应用、任务管理器等。 客户端&#xff1a;命令提示符&#xff08;cmd&#xff09;和PowerShell用于命令行操作。 2、Linux&#xff1a; 图形化管理工具&#xff1a;如GNOME、KDE等桌面环境中的系…

基于SSM+小程序的旅游社交登录管理系统(旅游4)

&#x1f449;文末查看项目功能视频演示获取源码sql脚本视频导入教程视频 1、项目介绍 ​ 本旅游社交小程序功能有管理员和用户。管理员有个人中心&#xff0c;用户管理&#xff0c;每日签到管理&#xff0c;景点推荐管理&#xff0c;景点分类管理&#xff0c;防疫查询管理&a…

一文带你了解:六款适合PC端的工时管理工具

1. 板栗看板 板栗看板是一个可视化的事项管理工具&#xff0c;由看板&#xff08;board&#xff09;、列表&#xff08;list&#xff09;、卡片&#xff08;card&#xff09;三个基本元素构成。用户通过在 “看板” 上布置和移动 “列表” 与 “卡片”&#xff0c;可以跟踪事项…