C++特性之一:继承

1. 派生类的成员变量、成员函数、构造、析构

在这里插入图片描述

2. 继承的切片

在这里插入图片描述

3. 重定义/隐藏

重定义/隐藏:派生类和基类有同名的成员,就叫隐藏。派生类的成员隐藏了基类的成员。

隐藏时可以通过类作用限定符来访问被隐藏的成员。

class Person
{
public:
	void Print()
	{
		cout << "Person " << ID << endl;
	}

	string name;	// 姓名
	int ID = 0;			// 身份证号
};

// 派生类Student继承了基类Person
class Student : public Person
{
public:
	void Print()
	{
		cout << "Student " << ID << endl;
	}

	int ID = 1;	// 学号
};

// 派生类Teacher继承了基类Student
class Teacher : public Student
{
public:
	void Print()
	{
		cout << "Teacher " << ID << endl;
	}

	int ID = 2;	// 工号
};
// 重定义/隐藏
void Test3()
{
	// 在上面的三个类中,成员函数Print()和成员变量ID都属于隐藏/重定义
	Person per;
	Student stu;
	Teacher tea;

	tea.Print();
	tea.Student::Print();
	tea.Person::Print();
}
// 输出结果为:
// Teacher 2
// Student 1
// Person 0

4. 派生类的默认成员函数

在说继承的切片时提到,我们可以将派生类中从基类那里拷贝过来的一部分成员变量看作一个整体,视为一个新的成员变量,它的类型是基类。
因此,在讨论派生类的默认成员函数的时候,我们就能明白一些规则。

为了方便叙述,我们对派生类进行以下划分:
在这里插入图片描述

  1. 构造函数

    在类中,若存在一个成员变量也是一个类,那么构造函数就会自动调用这个成员变量的默认构造函数,这里也是这个道理。

    派生类的构造函数会调用基类的默认构造函数,以完成对属于基类的那一部分的成员(上图的A部分)的初始化。如果基类没有默认构造函数,那么在派生类的构造函数中,就要显式调用基类的构造函数。

    先调用基类的构造,完成对A部分的构造,再构造B部分自己。

  2. 拷贝构造

    B部分的拷贝需要派生类自己来实现,但是A部分,则需要调用基类的拷贝构造函数来完成拷贝。

  3. 赋值运算符重载 operator=

    同理,A部分也需要调用基类的赋值运算符重载来完成这部分的赋值初始化。

  4. 析构函数

    先完成对B部分的析构,然后不用显式调用,编译器会自动调用基类的析构函数,来完成A部分的析构。

5. 继承与友元

友元关系并不能继承。
基类的友元,并不是派生类的友元,就好比父亲的朋友并不一定是孩子的朋友。
如果想要既是基类的友元,又是派生类的友元,则需要在两个类中都声明友元。

6. 继承与静态成员

基类中的静态成员,会和成员函数一样,仅仅生成一份,所有派生类用到的静态成员,都是这一份。这样做避免空间浪费。

7. 菱形继承和菱形虚拟继承

C++中允许多继承,也就是一个类继承了两个父类,这必然导致一个问题:菱形继承,请参考下图:
在这里插入图片描述

可见,在D类对象中,存了两份int a,这导致二义性和数据冗余的问题,在访问d对象中的a成员时,访问的是从B类中继承来的a呢,还是从C类中继承来的a?当然,解决方案就是:继承时,在作用域限定符::后加上关键字virtual
这便是虚拟继承,可以让int a 进存一份,B类对象、C类对象以及D类对象,仅需通过偏移量就可以得到a的地址。

用域限定符::后加上关键字virtual
这便是虚拟继承,可以让int a 进存一份,B类对象、C类对象以及D类对象,仅需通过偏移量就可以得到a的地址。

8. 组合

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

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

相关文章

ChatGPT提示词Prompts

好、不好的问题 好问题&#xff1a;哪种食物对于狗来说是有毒的&#xff1f;不好的问题&#xff1a;狗喜欢吃什么食物&#xff1f; 好问题&#xff1a;如何学习编程&#xff1f;不好的问题&#xff1a;编程难不难 好问题&#xff1a;如何去除衣服上的污渍&#xff1f;不好的问…

[WUSTCTF2020]朴实无华

查看robots.txt 找到/fAke_flagggg.php 显然这是个假的flag&#xff0c;但是我们在header处发现了fl4g.php 近来发现中文全部变成了乱码 插件转成utf8后正常显示 <?php header(Content-type:text/html;charsetutf-8); error_reporting(0); highlight_file(__file__);//leve…

电路维修(双端队列广搜)

达达是来自异世界的魔女&#xff0c;她在漫无目的地四处漂流的时候&#xff0c;遇到了善良的少女翰翰&#xff0c;从而被收留在地球上。 翰翰的家里有一辆飞行车。 有一天飞行车的电路板突然出现了故障&#xff0c;导致无法启动。 电路板的整体结构是一个 R 行 C 列的网格&a…

CSS 背景

CSS 背景 背景颜色 背景颜色若不设置&#xff0c;默认为透明(transparent) background-color: 颜色;背景颜色半透明 background: rgba(0, 0, 0, 0.3)前三个参数设定颜色&#xff0c;最后一个参数&#xff08;例如上述例子中的0.3&#xff09;设定透明度。0&#xff5e;1: 0…

[npm]覆盖依赖中内嵌的依赖的版本

背景&#xff1a; 开发过程中&#xff0c;我的项目中需要使用type/node这个依赖&#xff0c;如下图&#xff1a; type/node中又依赖了一个undici-types的包&#xff0c;如下图&#xff1a; 现在想要升级undici-types的版本&#xff0c;由于type/node官网暂时并没有使用最新版本…

机器学习——过拟合问题、正则化解决法

过拟合的基本概念 欠拟合&#xff1a;假设函数没有很好的拟合训练集数据&#xff0c;也称这个假设函数有高偏差&#xff1b; 过拟合&#xff1a;过拟合也称为高方差。在假设函数中添加高阶多项式&#xff0c;让假设函数几乎能完美的拟合每个样本数据点&#xff0c;这看起来很…

JSONObject在Android Main方法中无法实例化问题

目录 前言一、Main(非安卓环境)方法下运行二、安卓坏境下运行三、why? 前言 原生的json,即org.json.JSONObject; 在Android Studio中的Main方法里运行报错&#xff0c;但在安卓程序运行过程正常 一、Main(非安卓环境)方法下运行 static void test() {try {// 创建一个 JSON …

idea远程服务器debug

前提 本地代码和服务器代码一致 idea中创建远程服务 一般只需要修改ip&#xff0c;注意这边的端口是监听Socket的端口&#xff0c;不是服务的端口 然后把运行参数复制一下 -agentlib:jdwptransportdt_socket,servery,suspendn,address5005 tomcat启动 在tomcat的lib下的c…

爬虫案例2:playwright 超爽体验

参考链接&#xff1a;https://playwright.bootcss.com/python/docs/intro 目标网站&#xff1a;https://spa6.scrape.center/通过观察&#xff0c;页面的信息是通过Ajax请求后返回的信息 下面使用playwright实现绕过token的获取直接拿到返回的数据import asyncio import json f…

【相关问题解答2】bert中文文本摘要代码:结果输出为一些重复的标点符号和数字

【相关问题解答2】bert中文文本摘要代码 写在最前面问题1&#xff1a;tokenizer.py中encode函数&#xff0c;不能使用lower操作关于提问问题描述1一些建议1问题更新2&#xff1a;结果输出为一些重复的标点符号和数字一些建议21. 数据检查和预处理2. 模型和训练配置3. 过拟合和欠…

罐头鱼AI短视频矩阵获客|AI视频批量生成

罐头鱼AI传单功能操作说明&#xff0c;智能化提升您的视频营销效率&#xff01; 在这个信息爆炸的时代&#xff0c;短视频已成为企业营销的重要方式之一。而为了更高效地进行视频营销&#xff0c;罐头鱼AI传单功能应运而生&#xff0c;为您提供全方位的视频管理和发布服务。 首…

华为车控面试前后

个人经历&#xff1a; 秋招未接受其他公司offer&#xff0c;all in华子。 ->秋招失败0 offer 年前被车bu捞后入池开始审批。 ->等待超过1个月&#xff0c;陷入煎熬。 ->终于等到意向书。 分享时间线&#xff1a; 10月 笔试和3面入池2012 1月 收到车bu捞人电话解…

【OpenGL手册13】 光照贴图

目录 一、说明二、漫反射贴图三、镜面光贴图四、采样镜面光贴图练习 一、说明 在上一节中&#xff0c;我们讨论了让每个物体都拥有自己独特的材质从而对光照做出不同的反应的方法。这样子能够很容易在一个光照的场景中给每个物体一个独特的外观&#xff0c;但是这仍不能对一个…

10、设计模式之外观模式(Facade)

一、什么是外观模式 这个大家一定是经常使用的&#xff0c;外观模式&#xff08;门面模式&#xff09;是一种结构型设计模式。它提供一个统一的接口&#xff0c;用于访问子系统中的一组接口&#xff0c;隐藏了系统的复杂性。最简单的应用就是&#xff0c;当controller层的逻辑处…

ArcGIS JSAPI 学习教程 - ArcGIS Maps SDK for JavaScript 不同版本4.8-4.28(最新版)离线部署

ArcGIS JSAPI 学习教程 - ArcGIS Maps SDK for JavaScript 不同版本4.8-4.28&#xff08;最新版&#xff09;SDK离线部署 测试资源4.18 以及之前版本4.19 以及之后版本 接触一段时间 ArcGIS JSAPI 之后&#xff0c;整体感觉还好&#xff0c;后来需要解决不同版本问题&#xff0…

php apache 后台超时设置

最近在写一个thinkphp项目的时候&#xff0c;发现Ajax从后端请求数据时间比较长&#xff0c;大概需要45秒左右&#xff0c;但是一旦请求时间超过40s&#xff0c;页面就会超时500了&#xff0c;一开始以为是ajax请求时间不能太长&#xff0c;后来将Ajax请求改为同步且timeout设置…

休闲食品类目电商数据分析

食品的受众群里非常高&#xff0c;所以各品牌竞争也非常大&#xff0c;休闲食品作为人们闲余品味之物&#xff0c;也包揽了各大电商平台的主要流量&#xff0c;随着经济水平的提升&#xff0c;休闲食品类目的销售也随之不断增加&#xff0c;下面我们结合一些数据&#xff0c;去…

基于YOLOv8/YOLOv7/YOLOv6/YOLOv5的商品识别系统(深度学习+UI界面+训练数据集+Python代码)

摘要&#xff1a;在零售行业的技术进步中&#xff0c;开发商品识别系统扮演着关键角色。本博文详细阐述了如何利用深度学习技术搭建一个高效的商品识别系统&#xff0c;并分享了一套完整的代码实现。系统采用了性能强劲的YOLOv8算法&#xff0c;同时对YOLOv7、YOLOv6、YOLOv5等…

web项目抢购模块测试

web项目抢购模块测试 抢购模块(先测后台,再测前台)流程抢购用例编写测试点--后台抢购用例编写测试点--前台用例设计 面试题1: 当你发现研发实现的结果与需求不一致时怎么办? 需求评审的时候:需要确认所有输入类型的校验是针对单独的输入框做的还是在最终提交时校验 抢购模块 需…
最新文章