c++--继承

news2025/1/11 4:10:54

1.什么是继承

C++有面向对象三大特性,封装,继承,多态,封装。而继承就是代码可以复用的重要手段。他可以让程序员在原有类的基础上进行扩展,增加功能,产生新的类,称为子类或派生类,继承呈现了面向对象程序设计的层次结构,体现了由简单到复杂的认知过程。以前我们接触的复用都是函数复用,继承是类设计层次的复用。

2.继承的定义

注意:基类也可叫做父类,派生类也可叫做子类,但是必须父类和子类在一起,基类和派生类在一起,两者不能混合式同。

3.继承关系和访问限定符

继承方式:public继承/protected继承/private/继承

访问限定符:public访问/protected访问/private访问

继承基类访问关系的变化:

 注意:在实际运用中一般使用都是public继承,几乎很少使用protetced/private继承。

4基类和派生类访问赋值变化

  • 派生类对象 可以赋值给 基类的对象 / 基类的指针 / 基类的引用。这里有个形象的说法叫切片或者切割。寓意把派生类中父类那部分切来赋值过去。
  • 基类对象不能赋值给派生类对象。
  • 基类的指针或者引用可以通过强制类型转换赋值给派生类的指针或者引用。但是必须是基类的指针是指向派生类对象时才是安全的。

5.继承的作用域

  • 在继承体系中基类和派生类都有独立的作用域。
  • 子类和父类中有同名成员,子类成员将屏蔽父类对同名成员的直接访问,这种情况叫隐藏,也叫重定义。(在子类成员函数中,可以使用 基类::基类成员 显示访问)
  •  需要注意的是如果是成员函数的隐藏,只需要函数名相同就构成隐藏。
  •  注意在实际中在继承体系里面最好不要定义同名的成员

6.派生类默认成员函数

看代码:

//父类
class person
{
public:
	person(const char* str)
		:arr(new char[5])
	{
		memcpy(arr, str, 5);
		cout << "1" << endl;
	}

	person(const person& s)
	{
		char* tmp(s.arr);
		arr = tmp;
		memcpy(arr, s.arr, 5);
	}

	void operator=(const person& s)
	{
		if (arr != s.arr)
		{
			memcpy(arr, s.arr, 5);
		}
	}
	~person()
	{
		delete[] arr;
		arr = nullptr;
	}
private:
	char* arr;
};

//子类
class student :public person
{
public:
	student(const char* arr,const char* x)
		:person(arr)
		,a(new char[5])
	{
		memcpy(a, x, 5);
	}

	student(const student& str)
		:person(str)
	{
		//person(str);
		a = str.a;
	}
	void operator=(const student& str)
	{
		if (a != str.a)
		{
			person::operator = (str);
			a = str.a;
		}
	}
	~student()
	{
		person::~person();
		cout << "a" << endl;
	}
private:
	char* a;
};

通过上述代码可以看出,如果是内置类型,我们不写,编辑器就会自动生成一个,自定义类型,编辑器就会调用自定义类型所对应的构造函数。

  • 派生类的构造函数就会调用基类的构造函数初始化基类成员的那部分,自己的那部分就会调用自己的构造函数。
  • 派生类的赋值构造函数必须调用基类的复制构造函数完成基类的那部分,再调用自己的赋值构造函数。
  • 派生类的析构函数会在被调用完成后自动调用基类的析构函数清理基类成员。因为这样才能保证派生类对象先清理派生类成员再清理基类成员的顺序。
  • 派生类对象初始化先调用基类构造再调派生类构造。派生类对象析构清理先调用派生类析构再调基类的析构。

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

菱形继承:菱形继承是多继承的一种特殊情况

比如:

 

菱形继承的问题:从下面的对象成员模型构造,可以看出菱形继承有数据冗余和二义性的问题。在Assistant的对象中Person成员会有两份。

虚拟继承可以解决菱形继承的二义性和数据冗余的问题。如上面的继承关系,在Student和
Teacher的继承Person时使用虚拟继承,即可解决问题。需要注意的是,虚拟继承不要在其他地方去使用。(虚拟继承不常用)。
 

8.继承的意义

继承允许你根据基类的实现来定义派生类的实现。这种通过生成派生类的复用通常被称
为白箱复用(white-box reuse)。术语“白箱”是相对可视性而言:在继承方式中,基类的
内部细节对子类可见 。继承一定程度破坏了基类的封装,基类的改变,对派生类有很
大的影响。派生类和基类间的依赖关系很强,耦合度高。

实际尽量多去用组合。组合的耦合度低,代码维护性好。不过继承也有用武之地的,有
些关系就适合继承那就用继承,另外要实现多态,也必须要继承。类之间的关系可以用
继承,可以用组合,就用组合。减少依赖关系。

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

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

相关文章

【监控系统】Prometheus监控组件Node-Exporter配置实战

这一节&#xff0c;我们来配置一下Node-Exporter&#xff0c;那么我们先来了解一下什么是Prometheus的Exporter&#xff1f; 任何向Prometheus提供监控样本数据的程序都可以被称为一个Exporter&#xff0c;它是一种用于将不同数据源的指标提供给Prometheus进行收集和监控的工具…

会议口译服务,如何做好长交传翻译?

如何做好长交传翻译工作&#xff1f;我们知道&#xff0c;长交传是会议口译中常见的一种翻译方式&#xff0c;难度比较大&#xff0c;需要不间断的听取长度为3至5分钟的段落然后进行口译。那么&#xff0c;在进行长交传翻译练习中&#xff0c;如何提升交传口译的能力&#xff0…

Linux系统使用(超详细)

目录 Linux操作系统简介 Linux和windows区别 Linux常见命令 Linux目录结构 Linux命令提示符 常用命令 ls cd pwd touch cat echo mkdir rm cp mv vim vim的基本使用 grep netstat Linux面试题 Linux操作系统简介 Linux操作系统是和windows操作系统是并列…

JavaScript--改变 HTML 的值

要改变 HTML 元素的值&#xff0c;可以使用以下方法&#xff1a; 1.使用元素节点的 innerText 属性来改变元素的文本内容。 例如&#xff1a;element.innerText 新的文本内容; 2.使用元素节点的 innerHTML 属性来改变元素的 HTML 内容。 例如&#xff1a;element.innerHTML …

ModaHub魔搭社区:Zilliz Cloud 版本类型和价格计算器教程

目录 企业版 专有部署 价格计算器 在配置集群前,您需要先选择版本。Zilliz Cloud 各版本提供不同的服务体验、计费模型,且性能及可扩展性也都有所不同 。目前, Zilliz Cloud 共有 2 个版本可供选择,以满足多样的用户需求。 企业版专有部署2 个不同的版本为不同的用户需求…

python pytest脚本执行工具

pytest脚本执行工具 支持获取当前路径下所有.py脚本 添加多个脚本&#xff0c;一起执行 import tkinter as tk from tkinter import filedialog import subprocess import os from datetime import datetimedef select_script():script_path filedialog.askopenfilename(fil…

Redis 从入门到精通【进阶篇】之高可用哨兵机制(Redis Sentinel)详解

文章目录 0.前言1. 原理详解1.1. 哨兵机制的组建1.1. 哨兵是如何知道从库的信息 1.2. 主库下线的判定1.3. 哨兵集群选举1.4. 故障的转移 2. 总结3. Redis从入门到精通系列文章4. Redis哨兵模式面试题4. 1. 什么是Redis的哨兵模式&#xff1f;4. 2. 哨兵模式的优点是什么&#x…

云原生TDengine-v3.0部署手册

云原生TDengine-v3.0部署手册 一、管理namespace1.1 创建namespace1.2 namespaces列表 二、配置3份yaml文件2.1 tdengine3-storage-class.yaml2.2 taosd-service.yaml2.3 taosd-tdengine.yaml 三、服务部署3.1 部署StorageClass3.2 部署Service3.3 部署StatefulSet3.4 查看启动…

Linux--环境变量

指令分为两种&#xff1a; ①路径指令 比如我们都知道输入ls的作用是显示当前文件及目录&#xff0c;并且ls的路径是/usr/bin/ls。那么我输入ls与/usr/bin/ls的作用是等价的。之所以带路径&#xff0c;是因为不带路径找不到命令 ②系统指令 ls就是嵌入了环境变量后&#xff0c…

C语言程序设计——指针

一、字符指针 字符指针char*两种使用方法&#xff1a; //用法一&#xff1a;指向一个字符变量 char ch a; char* pc &ch; //用法二&#xff1a;指向一个字符串首地址 const char* p "abcde"; //注意p存储的是字符串的首地址&#xff0c;也就是字符a的地址。 …

基于node.js和Vue3的医院信息管理挂号系统

随着时代的发展,无线互联网技术的应用和普及给人们的生活带来了极大的改变,现在信息技术不仅可以提高我们的工作效率,还能有效的规避一些错误风险,节约人力成本。我国国民一方面对健康的要求越来越重视了&#xff0c;另一方面现代人的健康问题日益严重&#xff0c;所以医院信息…

【imarkdown】一个轻量级markdown图片链接转换器

imarkdown imarkdown是一个轻量级markdown图片链接转换器&#xff0c;你可以轻松地对图片链接进行本地到图片服务器、图片服务器到本地、图片服务器到图片服务器的转换。 因为语雀转markdown的时候图片存在防外链行为&#xff0c;如果想要把转出的markdown发表在其他平台&…

电子电路基础知识--电阻

视频教程 薄膜电阻 &#xff08;包括碳膜电阻、合成碳膜电阻、金属氧化膜电阻、玻璃釉膜电阻&#xff09;… 碳膜电阻 气态碳氢化合物在高温和真空中分解&#xff0c;碳沉积在蜜挂或者瓷管上&#xff0c;形成一层结晶碳膜。改变碳膜厚度和用刻槽的方法变更碳膜的长度&#…

驱动 day10 作业

要求&#xff1a;platform驱动实现 现象&#xff1a; test.c应用程序 #include <stdio.h> #include <stdlib.h> #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> #include <unistd.h> #include <string.h> #in…

Edge浏览器和Google浏览器占用内存情况

最近发现适用edge浏览器看视频时&#xff0c;或者打开多个网页&#xff0c;电脑就会变得非常卡顿&#xff0c;打开任务管理器发现内存占用较多&#xff0c;网上也有人说edge浏览器确实占用内存较多。但是给出的解决方案是更新windows系统&#xff0c;这个方法显然不能接受&…

Modbus tcp转ETHERCAT网关modbus tcp功能码

远创智控YC-ECT-TCP网关能够连接到Modbus tcp总线和ETHERCAT总线中&#xff0c;实现两种不同协议设备之间的通讯。这个网关能够大大提高工业生产的效率和生产效益&#xff0c;让生产变得更加智能化。远创智控YC-ECT-TCP 是自主研发的一款 ETHERCAT 从站功能的通讯网关。该产品主…

渗透专题丨Vulnhub-Tr0ll2靶机打靶

确认目标机IP&#xff1a;192.168.38.140 进行端口扫描&#xff1a; 查看一下版本&#xff1a; 没有查到关键信息&#xff0c;以80端口作为突破&#xff1a; 拿到提示信息&#xff1a; 接下来尝试ftp登录&#xff0c;根据提示信息&#xff1a; 登录之后&#xff0c;拿到lmao.z…

线性电源,开关电源

稳压器是如何工作的&#xff1f; 稳压器是这样一种电路&#xff1a;无论输入电压或负载条件如何变化&#xff0c;它都能产生并保持固定的输出电压。 稳压器&#xff08;VR&#xff09;将来自电源的电压保持在其他电气组件相容的范围之内。它最常用于DC / DC电源转换&#xff…

基于亚博K210开发板——串口中断以及开启双核任务

文章目录 开发板实验目的实验准备硬件原理图软件对应SDK对应的头文件 uart.huart.h接口函数高速通用异步收发传输器(UARTHS)对应的头文件 uarths.huarths.h接口函数板级对应的头文件 bsp.hbsp.h接口函数 实验代码实验结果效果 开发板 亚博K210开发板 实验目的 本实验配置串…