C++特性之一:继承

news2024/11/18 6:41:19

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.coloradmin.cn/o/1516586.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

一文了解Spring的SPI机制

文章目录 一文了解Spring的SPI机制Java SPIServiceLoader Spring SPISpringboot利用Spring SPI开发starter 一文了解Spring的SPI机制 Java SPI SPI 全称 Service Provider Interface &#xff0c;是 Java提供的一套用来被第三方实现或者扩展的接口&#xff0c;它可以用来启用…

考研数学——高数:高斯公式

助记: 关于积分时什么时候可以将变量整体代入积分式的问题&#xff1a;在积分过程中&#xff0c;如果某一整体恒为常量&#xff0c;则可以直接替换为定值&#xff0c;常见于对线或面的积分。 而在这题&#xff0c;用高斯公式之前是面积分&#xff0c;如果有这个整体出现的话是…

寒假作业Day 11

寒假作业Day 11 一、选择题 栈满的判断&#xff1a;在链式存储结构中&#xff0c;栈的大小是动态的&#xff0c;只受限于系统分配给程序的内存大小。因此&#xff0c;理论上&#xff0c;链式栈不会因为空间不足而“满”。所以&#xff0c;不需要判断栈满。 栈空的判断&#xf…

解决VS编译中文报错 error C2001:常量中有换行符

产生原因&#xff1a;文件中有中文字符&#xff0c;但是文件是utf-8格式的&#xff0c;使用msvc编译器编译时就会产生上述错误 首先说明&#xff1a;我是通过方法2解决该问题的。 解决办法&#xff1a; 方式1&#xff1a; 通过把源文件转换为gbk编码&#xff0c;但是只能一…

TCP和UDP基础

tcp服务器及客户端链接 ucd服务器及客户端

python自学7

第二章第一节面向对象 程序的格式都不一样&#xff0c;每个人填写的方式也有自己的习惯&#xff0c;比如收集个人信息&#xff0c;可能有人用字典字符串或者列表&#xff0c; 类的成员方法 类和对象 构造方法 挨个传输值太麻烦了&#xff0c;也没有方便点的&#xff0c;有&…

4_springboot_shiro_jwt_多端认证鉴权_Redis存储会话

1. 什么是会话 所谓的会话&#xff0c;就是用户与应用程序在某段时间内的一系列交互&#xff0c;在这段时间内应用能识别当前访问的用户是谁&#xff0c;而且多次交互中可以共享数据。我们把一段时间内的多次交互叫做一次会话。 即用户登录认证后&#xff0c;多次与应用进行交…

WPF —— Calendar日历控件详解

1&#xff1a; Calendar的简介 日历控件用于创建可视日历&#xff0c;让用户选择日期并在选择日期时触发事件。 DisplayMode 用来调整日历显示模式&#xff0c;分为Month、Year 和Decade 三种。如下是None 2&#xff1a;Calendar控件常用的属性 SelectionMode 选中日历的类…

原生php单元测试示例

下载phpunit.phar https://phpunit.de/getting-started/phpunit-9.html 官网 然后win点击这里下载 新建目录 这里目录可以作为参考&#xff0c;然后放在根目录下 新建一个示例类 <?phpdeclare(strict_types1);namespace Hjj\DesignPatterns\Creational\Hello;class He…

Python实战:爬取小红书

有读者在公众号后台询问爬取小红书&#xff0c;今天他来了。 本文可以根据关键词&#xff0c;在小红书搜索相关笔记&#xff0c;并保存为excel表格。 爬取的字段包括笔记标题、作者、笔记链接、作者主页地址、作者头像、点赞量。 一、先看效果 1、爬取搜索页 2、爬取结果保存到…

在IDE中配置tomcat服务器

目录 一、新建一个java项目二、添加web框架三、配置tomcat服务器四、运行访问发布的项目 前言&#xff1a;在 IntelliJ IDEA 中配置 Tomcat 服务器是 Java Web 开发的基础步骤&#xff0c;以下是如何在 IDEA 中设置 Tomcat 并部署 Web 项目的简要指南。 一、新建一个java项目 新…

DVWA-master 存储型xss

什么是存储型xss 存储型xss意味着可以与数据库产生交互的&#xff0c;可以直接存在数据库中 先将DVWA安全等级改为低 先随便写点东西上传 我们发现上传的内容会被显示&#xff0c;怎么显示的呢&#xff1f; 它先是上传到数据库中&#xff0c;然后通过数据库查询语句将内容回显 …

TSINGSEE青犀AI烟火识别等算法打造电瓶车消防安全解决方案

一、背景分析 根据国家消防救援局的统计&#xff0c;2023年全国共接报电动自行车火灾2.1万起&#xff0c;相比2022年上升17.4%&#xff0c;电动自行车火灾安全隐患问题不容忽视。 电瓶车火情主要问题和原因&#xff1a; 电瓶车/电池质量良莠不齐用户安全意识薄弱&#xff0c…

Shell编程入门

Shell编程入门 一、Shell概述1.1 Shell的作用1.2 Linux提供的Shell解释器1.3 Centos默认的解析器是bash 二、Shell脚本入门案例三、变量3.1 系统变量3.2 自定义变量3.3 特殊变量 四、运算符五、条件判断5.1 基本语法5.2 常用判断条件5.3 多条件判断 六、流程控制6.1 if语句6.2 …

山景BP1048 烧录器烧写

1.首先确保硬件连接没问题&#xff0c;烧写器不能亮红灯&#xff0c;亮红灯说明硬件没正确连接。硬件连接如下&#xff1a; 2.点击Flash Burner 3.编程目标闪存选择SDK包自带的烧写驱动器&#xff0c;闪存映像档选择编译好的bin文件。 4.点击刻录 5.看见有进度条在跑&#x…

一文看懂 关系模型-完整性约束

关系模型中有三类完整性约束&#xff1a;实体完整性、参照完整性和用户自定义的完整性。其中实体完整性和参照完整性是关系模型必须满足的完整性约束&#xff0c;被称为关系的两个不变性&#xff0c;由关系系统自动支持。 实体完整性详解&#xff1a; 若属性A是基本关系R的主属…

IPFoxy的正确打开方式

IPFoxy是一个全球动静态代理IP服务器软件&#xff0c;为全球用户提供优质的大数据代理服务&#xff0c;促进网络业务高校进行。目前拥有千万真实纯净IP资源&#xff0c;覆盖超过220个国家和地区&#xff0c;汇聚成优质海外代理池&#xff0c;支持http、https、socks5多种协议类…

什么是字节码?采用字节码的好处是什么?

在 Java 中&#xff0c;JVM 可以理解的代码就叫做字节码&#xff08;即扩展名为 .class 的文件&#xff09;&#xff0c;字节码是一种中间代码&#xff0c;它是由源代码经过编译生成的一种二进制表示形式。字节码通常不针对特定的硬件平台&#xff0c;而是针对虚拟机设计的&…

IEEE802.11v协议介绍

IEEE802.11v协议简介 协议全称:无线网络管理(Wireless Network Management) 批准日期:2011年2月 协议状态:并入802.11-2012 协议别名:BSS过渡管理 主要功能 支持AP和STA间交换:关于RF环境和拓扑状态的信息,以协助STA进行漫游决策支持STA之间交换:关于RF环境状态的信…

从政府工作报告探计算机行业发展(医疗健康领域)

从政府工作报告探计算机行业发展 政府工作报告作为政府工作的全面总结和未来规划&#xff0c;不仅反映了国家整体的发展态势&#xff0c;也为各行各业提供了发展的指引和参考。随着信息技术的快速发展&#xff0c;计算机行业已经成为推动经济社会发展的重要引擎之一。因此&…