【C++】学习笔记——继承_2

文章目录

  • 十二、继承
    • 5. 继承与友元
    • 6. 继承与静态成员
    • 7. 复杂的菱形继承及菱形虚拟继承
  • 未完待续


十二、继承

5. 继承与友元

友元关系不能继承,也就是说父类友元不能访问子类私有和保护成员 。除非子类也设置成友元。

6. 继承与静态成员

父类定义了 static 静态成员,则整个继承体系里面只有一个这样的成员。无论派生出多少个子类,都只有一个 static 成员实例 。这个方法可以统计整个体系一共产生了多少个对象。

#include<iostream>
using namespace std;class Person
{
public:Person(){++_count;}
protected:string _name; // 姓名
public:static int _count; // 统计人的个数。
};// 静态变量
int Person::_count = 0;class Student : public Person
{
protected:int _stuNum; // 学号
};class Graduate : public Student
{
protected:string _seminarCourse; // 研究科目
};void TestPerson()
{Student s1;Student s2;Student s3;Graduate s4;cout << " 人数 :" << Person::_count << endl;// _count 就一份Student::_count = 0;cout << " 人数 :" << Person::_count << endl;
}int main()
{TestPerson();return 0;
}

在这里插入图片描述

7. 复杂的菱形继承及菱形虚拟继承

继承关系分为:单继承、多继承。
单继承就是:一个子类只有一个直接父类时称这个继承关系为单继承
在这里插入图片描述
多继承就是:一个子类有两个或以上直接父类时称这个继承关系为多继承

// 多继承语法
class Assistant :public Student, public Teacher
{//
};

在这里插入图片描述
菱形继承是多继承的一种特殊情况。如下图:
在这里插入图片描述
但是菱形继承会产生一种问题:

在这里插入图片描述
在这里插入图片描述
解决方法之一就是 指定访问成员 ,这样仅仅能解决二义性的问题,但是数据冗余的问题并没得到解决。

#include<iostream>
using namespace std;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; // 主修课程
};void Test()
{// 这样会有二义性无法明确知道访问的是哪一个Assistant a;//a._name = "peter";// 需要显示指定访问哪个父类的成员可以解决二义性问题,但是数据冗余问题无法解决a.Student::_name = "xxx";a.Teacher::_name = "yyy";
}int main()
{Test();return 0;
}

另一种解决方法就是 虚继承 。虚继承可以解决菱形继承的二义性和数据冗余的问题。
虚拟继承的语法就是 在继承方式前面加上 virtual 关键字
在这里插入图片描述

#include<iostream>
using namespace std;class Person
{
public:string _name; // 姓名
};// 虚继承
class Student : virtual public Person
{
protected:int _num; //学号
};// 虚继承
class Teacher : virtual public Person
{
protected:int _id; // 职工编号
};class Assistant : public Student, public Teacher
{
protected:string _majorCourse; // 主修课程
};void Test()
{Assistant a;a._name = "peter";
}int main()
{Test();return 0;
}

但是,虚继承的 virtual 写在哪个地方呢?
在这里插入图片描述
虚继承到底是怎样解决数据冗余和二义性的问题的呢?我们来简化一个模型,看看他在底层是什么样的。我们先看看普通继承:

#include<iostream>
using namespace std;class A
{
public:int _a;
};class B : public A
// class B : virtual public A
{
public:int _b;
};class C : public A
// class C : virtual public A
{
public:int _c;
};class D : public B, public C
{
public:int _d;
};int main()
{D d;d.B::_a = 1;d.C::_a = 2;d._b = 3;d._c = 4;d._d = 5;return 0;
}

这是一个非常典型的菱形继承,B 和 C继承 A,D 又继承 B 和 C

在这里插入图片描述
由上图可知普通继承具有数据冗余性。接下来看看虚继承:

#include<iostream>
using namespace std;class A
{
public:int _a;
};// class B : public A
class B : virtual public A
{
public:int _b;
};// class C : public A
class C : virtual public A
{
public:int _c;
};class D : public B, public C
{
public:int _d;
};int main()
{D d;d.B::_a = 1;d.C::_a = 2;d._b = 3;d._c = 4;d._d = 5;return 0;
}

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
这里可以分析出 D对象中将A放到的了对象组成的最下面 ,这个A同时属于B和C,那么B和C如何去找到公共的A呢?这里是 通过了B和C的两个指针,指向的一张表。这两个指针叫虚基表指针,这两个表叫虚基表。虚基表中存的偏移量。通过偏移量可以找到下面的A


未完待续

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

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

相关文章

干最毒的事,做最靓的仔,贾诩为何会被称为“汉末第一毒士”?

两汉各有一毒士&#xff0c;西汉陈平&#xff0c;东汉贾诩。 啥叫“毒士”呢&#xff1f;就是那种专出那种缺德的招术、招招要人命的参谋、秘书。 这种人&#xff0c;对于他们的老板来说&#xff0c;那是绝对是嘎嘎好使&#xff0c;因为一出手就能起到立竿见影的效果。但是&a…

IC卡16个扇区详解:揭秘智能卡的存储结构

目录标题 IC卡的基本结构扇区的划分扇区的功能扇区的安全性扇区的应用NFC卡和IC卡&#xff0c;从外观怎样区分总结 在智能卡的世界里&#xff0c;IC卡&#xff08;Integrated Circuit Card&#xff09;以其安全性和便捷性成为了现代生活中不可或缺的一部分。无论是用于支付、身…

基于正点原子的FreeRTOS学习笔记——任务挂起与恢复

目录 学习目标&#xff1a; 学习笔记&#xff1a; 一、什么是挂起 二、任务挂起 三、任务恢复 四、中断中恢复任务 1、中断任务恢复函数 2、优先级说明 实验代码&#xff1a; 一、任务 二、中断 学习目标&#xff1a; 掌握任务的挂起与恢复 学习笔记&#xff1a; …

手撸XXL-JOB(二)——定时任务管理

在上一节中&#xff0c;我们介绍了SpringBoot中关于定时任务的执行方式&#xff0c;以及ScheduledExecutorService接口提供的定时任务执行方法。假设我们现在要写类似XXL-JOB这样的任务调度平台&#xff0c;那么&#xff0c;对于任务的管理&#xff0c;是尤为重要的。接下来我们…

C++语法|深入理解 new 、delete

在开发过程中&#xff0c;非常重要的语法就有我们new和delete&#xff0c;周所周知在C中最为强大的能力就是对内存的控制&#xff0c;所以我们再怎么强调new和delete都不为过 文章目录 1.new和delete基本语法new和malloc的区别是什么&#xff1f;(1)开辟单个元素的内存差别(2)开…

DGC-GNN 配置运行

算法 DGC-GNN&#xff0c;这是一种全局到局部的图神经网络&#xff0c;用于提高图像中2D关键点与场景的稀疏3D点云的匹配精度。与依赖视觉描述符的方法相比&#xff0c;这种方法具有较低的内存需求&#xff0c;更好的隐私保护&#xff0c;并减少了对昂贵3D模型维护的需求。DGC-…

卡片笔记写作法 精读笔记 01

元数据 卡片笔记写作法&#xff1a;如何实现从阅读到写作 书名&#xff1a; 卡片笔记写作法&#xff1a;如何实现从阅读到写作作者&#xff1a; 申克阿伦斯简介&#xff1a; 卢曼的“盒中笔记”通常很简短&#xff0c;因为这些只是他庞大繁杂研究中的索引&#xff0c;等需要时&…

工作太闲怎么办?有没有什么副业推荐?

如果您的工作太闲&#xff0c;可以考虑参加一些副业&#xff0c;利用您的空余时间进行一些有意义的活动。以下是一些副业建议 1. 在线兼职 可以通过一些在线平台寻找兼职工作&#xff0c;如做在线调查、参与评估、进行数据输入等。 2.做任务 还可以做下百度的致米宝库&#…

2024第16届四川教育后勤装备展6月1日举办 欢迎参观

2024第16届四川教育后勤装备展6月1日举办 欢迎参观 邀请函 主办单位&#xff1a; 中国西部教体融合博览会组委会 承办单位&#xff1a;重庆港华展览有限公司 博览会主题&#xff1a;责任教育 科教兴邦 组委会&#xff1a;交易会159交易会2351交易会9466 展会背景 成都…

009.Rx(Reactive Extenstions)的关系

响应式扩展库在组成响应式系统的应用程序中发挥作用&#xff0c;它与消息驱动的概念相关。Rx不是在应用程序或服务器之间移动消息的机制&#xff0c;而是在消息到达时负责处理消息并将其沿着应用程序内部的执行链传递的机制。需要说明的是&#xff0c;即使您没有开发包含许多组…

暗区突围TWITCH掉宝领测试资格后,steam激活显示是无效激活码

自《暗区突围》测试启动以来&#xff0c;吸引了大量玩家关注&#xff0c;特别是通过在Twitch平台上观看直播即可获得测试资格的活动&#xff0c;更是掀起了热潮。然而&#xff0c;部分玩家在成功获得激活码后&#xff0c;在Steam平台激活时遭遇了“无效激活码”的问题。本文将提…

力扣HOT100 - 763. 划分字母区间

解题思路&#xff1a; class Solution {public List<Integer> partitionLabels(String s) {int[] last new int[26];int len s.length();for (int i 0; i < len; i) {last[s.charAt(i) - a] i;//记录字母最远的下标}List<Integer> partition new ArrayList…