C++_基本语法笔记_继承和多态

news2024/9/20 17:56:13

继承

思想与Java差不多

基本语法

  • 语法:class 子类 : 继承方式 父类
    在这里插入图片描述

继承方式

  • 将访问权限,上升到保护权限,上升到更高的私有权限
    在这里插入图片描述

继承哪些部分

  • 继承过程中,即使权限不能访问,也会全部继承下来(非静态属性是共有的,不会继承)

在这里插入图片描述

构造和析构顺序

    1. 先构造父类
    1. 构造子类
    1. 析构子类
    1. 析构父类

子类和父类出现同名成员

若子类和父类,有相同名字的成员(属性/方法)。

  • 加作用域就完事

在这里插入图片描述

  • 同名属性值:
    在这里插入图片描述在这里插入图片描述
  • 同名函数:
    在这里插入图片描述
  • 无论是属性还是方法,都会优先用子类的,即使重载才有可能溯源到父类

子类和父类出现同名成员(静态)

处理方式一致
在这里插入图片描述

  • 访问方式:
  • 直接访问子类;
  • 通过子类访问父类。
    在这里插入图片描述

多继承(一个类继承多个类)

语法: class 子类 : 继承方式 父类1 , 继承方式 父类2...。如果有同名成员出现,加作用域区分。

  • 两个父类有相同属性值:
    在这里插入图片描述
  • 使用方式:
    在这里插入图片描述

菱形继承

在这里插入图片描述一些问题:
在这里插入图片描述
解决:

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

  • 虚继承:子类在继承父类时,加上关键字 virtual。
  • 下面的 sheep 和 tuo 都在虚拟继承Animal类。这时,Animal类被称为 虚基类

在这里插入图片描述

  • 虚继承就是使用虚类指针 指向 虚类表,多个子类共享继承的成员,不会混乱
    在这里插入图片描述
  • 虚基类的底层:
    在这里插入图片描述

再举个例子:
在这里插入图片描述

  • 下面来用存储结构说明一下:

  • 左边是非虚继承,A类继承了2个 int a 的值。

  • 右边是虚继承,只有一份 int a 的值,两个virtual继承的子类B和C,其实不是真的继承,只是用表指向共有的a值

在这里插入图片描述

多态

基本用法

在这里插入图片描述

  • 小贴士:静态绑定在程序运行中不可更改,记住这个

  • 在下面准备两个类,都有speak方法

在这里插入图片描述没有产生希望的 ”小猫在说话”:

  • 形参这里Animal &animal等同于 Animal & animal = cat
  • 函数内animal.speak应该是:小猫 才对。但是因为草绑定,绑定的是父类Animal类。

在这里插入图片描述

解决方式:虚函数。可以实现地址晚绑定,从而实现动态多态

  • 虚函数speak写在父类里,直到确认某个对象,才绑定地址
  • virtual允许父子类之间的函数重载(重写也行)

在这里插入图片描述
多态条件:

  1. 有继承
  2. 子类要重写从父类继承来的虚函数(类似Java的抽象函数强制重写)

使用条 件:

  1. 参数:父类的指针/引用,执行子类对象

多态内部原理

  • 父类和子类都有虚函数表

  • 虚函数表内部记录当前作用域中虚函数(speak)的地址

  • 当子类重写父类的虚函数,子类的虚函数表中内容就会被覆盖

  • 多态的关键是虚函数指针和虚函数表

在这里插入图片描述

抽象类

父类:抽象计算器
子类:加/减/乘/除法计算器

多态:getResult声明为虚函数,期待各种子类重写
在这里插入图片描述多态方便维护某个加/减/乘/除计算器

在这里插入图片描述

纯虚函数 抽象类

和Java很像:在父类中声明纯虚函数,强制子类重写该函数。有纯虚函数的类叫抽象类,不能实例对象。
在这里插入图片描述在这里插入图片描述

多态案例

在这里插入图片描述
定义抽象类:
在这里插入图片描述
重写两个子类内部的方法
在这里插入图片描述

使用多态接口,传入父类的指针,调用传入子类的 重写的方法。
在这里插入图片描述

虚析构 和 纯虚析构

在这里插入图片描述
用小猫和Animal的父类子类举例:

其构造函数中,在堆区new一个字符串,m_Name指向这个字符串。

在这里插入图片描述发现cat的析构函数没有执行,也就是说m_Name没有被释放

修改父类中的析构函数为虚析构:
在这里插入图片描述
在这里插入图片描述
总结:
在这里插入图片描述

组装电脑的例子

在这里插入图片描述

  1. 创建三个大类:CPU,GPU,Memory
//三个零件 抽象类:

//CPU基类/父类
class CPU {

public:
	virtual void caculate() = 0;

};

class GPU {

public:
	virtual void show() = 0;

};


class Memory {

public:
	virtual void storage() = 0;

};
  1. 创建电脑类,通过指针获取构造函数传入的零件,调用零件内的功能。
// 电脑类:
class Computer {

public:		//记得加权限
	//构造时传入三个指针,并保存在本类中
	Computer(CPU* cpu, GPU* gpu, Memory* mem) {
		this->m_cpu = cpu;
		this->m_gpu = gpu;
		this->m_mem = mem;
	}

	void dowork() {
		//分别调用传入的三个类,对应的方法
		m_cpu->caculate();
		m_gpu->show();
		m_mem->storage();
	}

	//用来释放下面的三个零件指针
	~Computer() {
		if (m_cpu != NULL) {
			delete m_cpu;
			m_cpu = NULL;
		}
		if (m_gpu != NULL) {
			delete m_gpu;
			m_gpu = NULL;
		}
		if (m_mem != NULL) {
			delete m_mem;
			m_mem = NULL;
		}

	}

// 三个零件指针
private:
	CPU* m_cpu;
	GPU* m_gpu;
	Memory* m_mem;
};
  1. 创建这两个品牌的零件,重写内部功能
//两个具体厂商:
class IntelCPU :public CPU {
public:
	//重写抽象类中的虚函数
	void caculate() {
		cout << "IntelCPU" << endl;
	}
};

class IntelGPU :public GPU {
public:
	void show() {
		cout << "IntelGPU" << endl;
	}
};

class IntelMem :public Memory {
public:
	void storage() {
		cout << "IntelMem" << endl;
	}
};

class LenCPU :public CPU {
public:
	void caculate() {
		cout << "LenCPU" << endl;
	}
};

class LenGPU :public GPU {
public:
	void show() {
		cout << "LenGPU" << endl;
	}
};

class LenMem :public Memory {
public:
	void storage() {
		cout << "LenMem" << endl;
	}
};
  1. 创建对象,用指针定位,再把指针传入构造函数,并调用对象功能。
void test01() {
	IntelCPU* icpu = new IntelCPU;
	IntelGPU* igpu = new IntelGPU;
	IntelMem* imem = new IntelMem;
	//也可以:
	//CPU* icpu = new IntelCPU;
	//GPU* igpu = new IntelGPU;
	//Memory* imem = new IntelMem;

	Computer* computer1 = new Computer(icpu, igpu, imem);
	computer1->dowork();

	delete computer1;	//释放new出来的对象

}

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

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

相关文章

Liunx搭建Rustdesk远程桌面服务

1、环境准备 Linux&#xff1a;centos7.9 rustdesk server安装包 很多新服务器并没有 wget 和unzip 可以通过yum自行安装下&#xff0c;如果系统中有wget但不能使用&#xff0c;直接卸载重装即可。 yum install wget wget --no-check-certificate https://github.com/rust…

商家福音!阿里巴巴1688又一线下选品中心落地!

7月31日&#xff0c;阿里旗下1688台州选品中心正式开园。后续1688将在核心产业带陆续开设线下选品中心。选品中心的运营模式为“四位一体”&#xff1a;政府搭台&#xff0c;1688提供技术、销售渠道和数字化能力&#xff0c;本地产业链的链主负责运营&#xff0c;本地源头工厂入…

跟着iMeta学做图|ggplot2绘制多个饼图展示菌群物种组成

原始教程链接&#xff1a;https://github.com/iMetaScience/iMetaPlot/tree/main/221017multi-pieplot 写在前面 饼图 (Pie Plot) 在微生物组研究中可以用来展示菌群物种组成&#xff0c;可以起到与堆叠柱状图相同的展示效果。本期我们挑选2022年4月5日刊登在iMeta上的The imp…

浅谈大模型私有化+精调:面向垂直行业与特定场景之需

今天将继续“AI技术”系列&#xff0c;探讨大模型的私有化和精调&#xff0c;以便让预训练的通用模型更好地适应特定的任务或行业需求。 当然&#xff0c;从产品经理的视角出发&#xff0c;我们不会非常深入&#xff08;鄙人能力也有限&#xff09;&#xff0c;而是建立相关的…

HTTP协议和web服务器(Tomcat)

Author&#xff1a;Dawn_T17&#x1f965; 目录 二.请求协议 三.响应协议 四.协议解析 Socket 编程 Servlet介绍 Web服务器 五.Tomcat 简介 HTTP 即超文本传输协议 它是一种应用层协议&#xff0c;用于客户端&#xff08;如浏览器&#xff09;和服务器之间的通信。 为什…

《网络安全自学教程》- Linux安全标识符、身份鉴别、访问控制

《网络安全自学教程》 操作系统有4个安全目标&#xff0c;也就是说想要保证操作系统的安全&#xff0c;就必须实现这4个需求&#xff1a; 标识系统中的用户和进行身份鉴别。依据系统安全策略对用户的操作进行访问控制&#xff0c;防止用户和外来入侵者对计算机资源的非法访问。…

mysql误删数据恢复记录

背景 1、数据库版本 5.7.36&#xff0c;由于误操作删掉了表的所有数据&#xff0c;但是数据库备份每天凌晨进行、只能从备份恢复昨日的全量数据&#xff0c;当日的数据将会丢失 查看binlog配置 尝试恢复 1、找到binlog文件 误删除后立即刷新binlog flush logs 2、binlog转…

OpenAI GPT-2 model use with TensorFlow JS

题意&#xff1a;使用 TensorFlow JS 应用 OpenAI GPT-2 模型 问题背景&#xff1a; Is that possible to generate texts from OpenAI GPT-2 using TensorFlowJS? 是否可以使用 TensorFlowJS 生成 OpenAI GPT-2 的文本&#xff1f; If not what is the limitation, like mo…

010集——按值传递、按引用传递等方法——C#学习笔记

按值传递参数 这是参数传递的默认方式。在这种方式下&#xff0c;当调用一个方法时&#xff0c;会为每个值参数创建一个新的存储位置。 实际参数的值会复制给形参&#xff0c;实参和形参使用的是两个不同内存中的值。所以&#xff0c;当形参的值发生改变时&#xff0c;不会影…

MDK常见概念

&#xff08;1&#xff09;typedef定义结构体类型 typedef struct {uint32_t BaudRate;uint32_t WordLength;uint32_t StopBits;uint32_t Parity;uint32_t Mode;uint32_t HwFlowCtl;uint32_t OverSampling; } UART_InitTypeDef; &#xff08;2&#xff09;寄存器 (3)DMA DMA 是…

2024年第八届计算生物学与生物信息学国际会议 (ICCBB 2024)即将召开!

2024 年第八届计算生物学和生物信息学国际会议&#xff08;ICCBB 2024&#xff09;将于2024年11月28 -30在日本京都召开&#xff0c;ICCBB 2024是展示理论、实验和应用计算生物学和生物信息学领域新进展和研究成果的主要论坛之一。我们相信&#xff0c;通过大家的共同努力&…

【问题】容器部署场景Spring Bean偶尔循环依赖问题

问题描述 在本地开发中不会发生循环依赖问题&#xff0c;但是在容器场景下&#xff0c;制作成镜像启动后异常出现Bean的循环依赖。 问题原因 开发者在代码中使用构造函数注入来引用依赖的 Bean&#xff0c;这种方式可能导致循环依赖问题。虽然 Spring 框架具备循环依赖的处理…

thinkphp漏洞之sql注入漏洞-builder处漏洞

目录 适用版本 环境搭建 文件下载安装 配置文件修改 漏洞分析 适用版本 注&#xff1a;thinkphp版本&#xff1a;5.0.13<ThinkPHP<5.0.15 、 5.1.0<ThinkPHP<5.1.5 环境搭建 文件下载安装 在github上面下载相应版本&#xff0c;下载think文件&#xff0c;…

乳制品企业怎么防止信息泄露?使用加密软件保障数据安全

乳,制品行业使用加密软件主要是为了保障企业的核心数据安全&#xff0c;防止敏感信息泄露&#xff0c;如:产品配方、生产流程、销售数据等&#xff0c;通过使用加密软件&#xff0c;来保护重要的数据.。一、加密软件在乳制品企业的重要性1、保护重要数据:乳制品企业拥有大量敏感…

SQL 变量写法、排序问题 <12>

一、定义变量排序 目的1&#xff1a;合并学生表和分数表&#xff0c;将每个班分别排名 目的2&#xff1a;遇到相同分数&#xff0c;考虑还是不考虑相同分数排名 学生表&#xff08;1000条&#xff09;和分数表&#xff08;6000条&#xff09;分别如下 1、定义变量、简答排序…

datax和datax-web打包成docker运行

概述 datax和datax-web从一台机器迁移到另一台时&#xff0c;要重新搭建一套运行环境&#xff0c;比较麻烦&#xff1b;打包成docker镜像后迁移就方便多了; 因为我的mysql版本是8&#xff0c;需要在datax的read和write中手动添加8的jdbc驱动 所以我先各自下载好了datax和data…

JavaEE 的入门

1. 学习JavaEE Java EE(Java Platform Enterprise Edition), Java 平台企业版. 是JavaSE的扩展, ⽤于解决企业级的开 发需求, 所以也可以称之为是⼀组⽤于企业开发的Java技术标准. 所以, 学习JavaEE主要是学习Java在 企业中如何应⽤. 前⾯学习的是Java基础, JavaEE 主要学习Jav…

修改docker数据存储目录及拉取镜像安装oracle19c

一、修改docker数据目录&#xff0c;默认安装路径为/var/lib/docker 查看docker主路径 docker info |grep "Docker Root Dir"1.停服务 systemctl stop docker2.新建目录并授权 mkdir /data/docker -p chown -R root:docker /data/docker/3.修改配置文件 原有{}内…

微信小程序预览PDF、H5预览PDF、网页预览PDF,并添加专属文字水印

下载PDF.js 点击PDF.js下载地址 引入预览PDF 文件 // const url new URL("./1.pdf", import.meta.url).href // 在本地项目获取pdf // const url "https://xxxx/05d833041f.pdf" // 在线上链接获取pdf const url query.get(url) // 在地址栏获取pdf c…

2024年Q2震撼来袭!AMD数据中心与笔记本CPU市场独占鳌头,强劲表现引爆业界关注!

根据CPU市场追踪机构Mercury Research的最新报告&#xff0c;AMD在2024年第二季度再次取得了显著成绩&#xff0c;在数据中心和笔记本电脑CPU市场上份额有所增加。然而&#xff0c;Intel在台式机市场仍占据优势&#xff0c;并在整体出货量上保持领先地位。 在2024年第二季度&a…