C++类和对象——多态详解

目录

1.多态的基本语法

2.多态的原理剖析

示例:计算机类 

3.纯虚函数和抽象类

示例:制作饮品

4.虚析构和纯虚析构 

示例:电脑组装


1.多态的基本语法

代码示例:

#include<bits/stdc++.h>
using namespace std;

class music
{
public:
//加virtual实现晚绑定
	virtual void listen()
	{
		cout << "listen music" << endl;
	}
};

class rock : public music
{
public:
	void listen()
	{
		cout << "listen rock" << endl;
	}
};

//不加virtual是地址早绑定
//如果想要听rock就应该让地址晚绑定,或者说在运行阶段进行绑定
void dolisten(music &m)
{
	m.listen();
}

int main()
{
	rock r;
	dolisten(r);
	
	return 0;
}

 

2.多态的原理剖析

空类的大小为1 

加了virtual后会变为4或8个字节,这恰好是一个指针的大小

#include<bits/stdc++.h>
using namespace std;

class music
{
public:
//加virtual实现晚绑定
	virtual void listen()
	{
		cout << "listen music" << endl;
	}
};

class rock : public music
{
public:
	void listen()
	{
		cout << "listen rock" << endl;
	}
};

//不加virtual是地址早绑定
//如果想要听rock就应该让地址晚绑定,或者说在运行阶段进行绑定
void dolisten(music &m)
{
	m.listen();
}

int main()
{
	rock r;
	cout << sizeof(rock) << endl;
	
	return 0;
}

 

vfptr是一个虚函数(表)指针

当子类重写父类的虚函数,子类中的虚函数表位置会替换成子类的虚函数地址

简单理解:就是父类会将它的函数继承给它的子类,但当子类使用virtual(多态后)会将父类继承给它的覆盖掉

多态使用条件:父类的指针或者引用指向子类对象

示例:计算机类 

#include<bits/stdc++.h>
using namespace std;

class calculator
{
public:

	virtual int getresult()
	{
		return 0;
	}
	
	int x;
	int y;
};

class addcalculator : public calculator
{
public:

	int getresult()
	{
		return x + y;
	}
};

class subcalculator : public calculator
{
public:

	int getresult()
	{
		return x - y;
	}
};

int main()
{
	//多态实现计算机的加法和减法
	calculator *c = new addcalculator;
	c -> x = 50,c -> y = 60;
	cout << c -> getresult() << endl;
	delete c;
	
	c = new subcalculator;
	c -> x = 60,c -> y = 50;
	cout << c -> getresult() << endl;
	delete c;
	
	return 0;
}

 

3.纯虚函数和抽象类

 

 

#include<bits/stdc++.h>
using namespace std;

class base
{
public:
	
	virtual void func() = 0;
};

class son : public base
{
public:

	virtual void func()
	{
		cout << "func函数调用" << '\n';
	}
};

int main()
{
	base *b = new son;
	b -> func();
	delete b;
	
	return 0;
}

 

示例:制作饮品

 

#include<bits/stdc++.h>
using namespace std;

class drinking
{
public:

	//煮水
	virtual void boil() = 0;
	
	//冲泡
	virtual void brew() = 0;
	
	//倒入杯中
	virtual void pourintocup() = 0;
	
	//加入佐料
	virtual void addseasoning() = 0;
	
	//制作饮品
	void makedrinking()
	{
		boil();
		brew();
		pourintocup();
		addseasoning();
	}
};

class coffee : public drinking
{
public:
	//煮水
	virtual void boil(){
		cout << "烧开水" << endl;
	}
	
	//冲泡
	virtual void brew(){
		cout << "加咖啡粉" << endl;
	}
	
	//倒入杯中
	virtual void pourintocup(){
		cout << "倒入杯中" << endl;
	}
	
	//加入佐料
	virtual void addseasoning(){
		cout << "加糖,加牛奶" << endl;
	}
	
};

void make(drinking *d)
{
	d -> makedrinking();
	delete d;
}

int main()
{
	//开始做咖啡
	make(new coffee);
	
	return 0;
}

 

4.虚析构和纯虚析构 

#include<bits/stdc++.h>
using namespace std;

class animal
{
public:
	animal()
	{
		cout << "animal构造函数调用" << endl;
	}
	
	//利用虚析构解决父类指针释放子类对象时不干净的问题
	// virtual ~animal()
	// {
		// cout << "animal虚析构函数调用" << endl;
	// }
	
	virtual ~animal() = 0;
	
	//纯虚析构,需要声明也需要实现
	//有了纯虚析构之后,这个类也属于抽象类,无法实例化对象
	virtual void speak() = 0;
};

animal::~animal()
{
	cout << "animal的纯虚构函数调用" << endl;
}

class cat : public animal
{
public:
	cat(string name)
	{
		cout << "cat构造函数调用" << endl;
		this -> name = new string(name);
	}
	
	virtual void speak()
	{
		cout << *name << "在说话" << endl;
	}
	~cat()
	{
		cout << "cat析构函数调用" << endl;
		if(name != NULL)
		{
			delete name;
			name = NULL;
		}
	}
	string *name;
};

int main()
{
	animal *a = new cat("Tom");
	a -> speak();
	delete a;
	
	return 0;
}

 

 

示例:电脑组装

#include<bits/stdc++.h>
using namespace std;

class cpu
{
public:

	virtual void calculator() = 0;
};

class videocard
{
public:

	virtual void display() = 0;
};

class memory
{
public:

	virtual void storage() = 0;
};

class computer
{
public:

	computer(cpu *c,videocard *v,memory *m)
	{
		this -> c = c;
		this -> v = v;
		this -> m = m;
	}
	
	void make()
	{
		c -> calculator();
		v -> display();
		m -> storage();
	}
	
	~computer()
	{
		if(c != NULL)
		{
			delete c;
			c = NULL;
		}
		
		if(v != NULL)
		{
			delete v;
			v = NULL;
		}
		
		if(m != NULL)
		{
			delete m;
			m = NULL;
		}
	}
	
private:

	cpu *c;
	videocard *v;
	memory *m;
};

class intelcpu : public cpu
{
public:

	virtual void calculator()
	{
		cout << "intelcpu" << endl;
	}
};

class amd : public videocard
{
public:

	virtual void display()
	{
		cout << "amdvideocard" << endl;
	}
};

class kingston : public memory
{
public:

	virtual void storage()
	{
		cout << "kingstonmemory" << endl;
	}
};

int main()
{
	cpu *c = new intelcpu;
	videocard *v = new amd;
	memory *m = new kingston;
	
	computer *com = new computer(c,v,m);
	com -> make();
	delete com;
	
	return 0;
}

 

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

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

相关文章

1903_CoreMark白皮书阅读笔记

1903_CoreMark白皮书阅读笔记 全部学习汇总&#xff1a; g_embedded: 嵌入式通用技术学习笔记 (gitee.com) 再看ARM的内核架构介绍的时候看到了不同的内核都测试了一个CoreMark/Mhz的参数。从名称看&#xff0c;可以理解为是MCU的算力跑分。至于这部分究竟是测试了哪些功能&…

CV论文--2024.2.22

SOURCE&#xff1a;CV论文--2024.2.22 1、CounterCurate: Enhancing Physical and Semantic Visio-Linguistic Compositional Reasoning via Counterfactual Examples 中文标题&#xff1a;CounterCurate&#xff1a;通过反事实示例增强物理和语义视觉语言组合推理 简介&…

“替代云”知多少?Akamai Linode 重新定义公有云服务!

自2006年云计算概念提出以来&#xff0c;云产业已经成为数字化时代所必备的底层基础&#xff0c;但随着多元化的业务需求的增多&#xff0c;多云战略、本地部署所形成混合环境&#xff0c;都使得云复杂性&#xff0c;日渐成为了迫在眉睫的挑战。 451 Research 云价格指数 (CPI…

HarmonyOS Stage模型基本概念讲解

本文 我们来说harmonyos中的一种应用模型 Stage模型 官方提供了两种模型 一种是早期的 FA模型 另一种就是就是 harmonyos 3.1才开始的新增的一种模型 Stage模型 目前来讲 Stage 会成为现在乃至将来 长期推进的一种模型 也就是 无论是 现在的harmonyos 4.0 乃至 之后要发布的 …

pytest基本应用

文章目录 1.pytest安装2.用例运行规则3.常用参数断言运行参数用例控制setup和teardownini配置文件 4.常用插件5.pytest高阶用法用例跳过参数化 6.pytest之Fixture使用fixture使用装饰器usefixtures 7.pytest之conftest.py8.conftestfixtureyieldyield介绍前后置使用 1.pytest安…

2012及其以上系统修改服务器密码指南

修改服务器密码指南,目前介绍两种不同的方案 方法一 指令式 winR键 弹出运行框里输入 cmd 点击确认或者右下角开始程序里面的点开运行 2.在弹出框里手动输入以下一组文字&#xff1a;net user administrator 123456 框内无法粘贴 需要手动输入 其中administrator 是用…

4核8G服务器腾讯云和阿里云租用价格对比,2024更新

4核8G云服务器多少钱一年&#xff1f;阿里云ECS服务器u1价格955.58元一年&#xff0c;腾讯云轻量4核8G12M带宽价格是646元15个月&#xff0c;阿腾云atengyun.com整理4核8G云服务器价格表&#xff0c;包括一年费用和1个月收费明细&#xff1a; 云服务器4核8G配置收费价格 阿里…

Sora刷爆了,先来了解下基本情况

2月15日&#xff0c;OpenAI发布的Sora模型确实在文生视频领域取得了显著的进步&#xff0c;其特点和创新性表现在以下几个方面&#xff1a; 视频生成长度&#xff1a;Sora模型能够生成长达1分钟的视频&#xff0c;这相比之前的文生视频模型有了显著的提升。这一长度的视频已经…

后端程序员入门react笔记——react的diff算法(三)

diffing算法 虚拟dom 我们知道&#xff0c;react里面操作的都是虚拟dom&#xff0c;最后经过render渲染为真正的dom&#xff0c;那么为什么要提出虚拟dom这个概念呢&#xff1f;其实就是将逻辑和视图区分开&#xff0c;react的虚拟dom&#xff0c;就相当于mvc的c&#xff0c;…

网络安全实验(三)补充

1.假设内网用户需要通过外网的web服务器和pop3邮件服务器下载文件和邮件&#xff0c;内网的FTP服务器也需要接受外网用户上传的文件。针对该场景进行防病毒的防护。 2.我们需要针对办公区用户进行上网行为管理&#xff0c;要求进行URL过滤&#xff0c;要求在上班时间仅能访问教…

UE蓝图 入口(FunctionEntry)节点和源码

系列文章目录 UE蓝图 Get节点和源码 UE蓝图 Set节点和源码 UE蓝图 Cast节点和源码 UE蓝图 分支(Branch)节点和源码 UE蓝图 入口(FunctionEntry)节点和源码 文章目录 系列文章目录一、FunctionEntry节点功能二、入口节点用法1. 创建函数2. 命名函数3. 定义参数4. 编写函数逻辑5…

http协议工具:apache详解

目录 一、常见的http服务程序 1、 Apache HTTP Server 介绍 1.1 apache 概念 1.2 apache 功能 1.3 apache 特性 2、MPM&#xff08;multi-processing module&#xff09;工作模式 2.1 prefork 2.2 worker 2.3 event 二、Apache HTTP Server安装和相关文件 1、安装方…

五种多目标优化算法(MOGWO、MOJS、NSWOA、MOPSO、MOAHA)性能对比,包含6种评价指标,9个测试函数(提供MATLAB代码)

一、5种多目标优化算法简介 1.1MOGWO 1.2MOJS 1.3NSWOA 1.4MOPSO 1.5MOAHA 二、5种多目标优化算法性能对比 为了测试5种算法的性能将其求解9个多目标测试函数&#xff08;zdt1、zdt2 、zdt3、 zdt4、 zdt6 、Schaffer、 Kursawe 、Viennet2、 Viennet3&#xff09;&#xff0…

多维时序 | Matlab实现基于VMD-DBO-GRU、VMD-GRU、GRU的多变量时间序列预测

多维时序 | Matlab实现基于VMD-DBO-GRU、VMD-GRU、GRU的多变量时间序列预测 目录 多维时序 | Matlab实现基于VMD-DBO-GRU、VMD-GRU、GRU的多变量时间序列预测预测效果基本介绍程序设计参考资料 预测效果 基本介绍 Matlab实现基于VMD-DBO-GRU、VMD-GRU、GRU的多变量时间序列预测…

AWS安全组是什么?有什么用?

最近看到小伙伴在问&#xff0c;AWS安全组是什么&#xff1f;有什么用&#xff1f;今天我们大家就来简单聊聊&#xff0c;仅供参考哦&#xff01; AWS安全组是什么&#xff1f;有什么用&#xff1f; 【回答】&#xff1a;AWS安全组是一种虚拟防火墙&#xff0c;用于控制进出…

Eclipse项目间的引用

我们在开发的时候&#xff0c;有时候需要把一个大的项目打散&#xff0c;尤其是现在微服务的架构很流行&#xff0c;一个大的项目往往被拆成很多小的项目&#xff0c;而有的项目作为公共工程被独立出来&#xff0c;比如有个工程专门提供各种Util工具类&#xff0c;有的工程专门…

【hoare优化版】快速排序算法(2)

目录 GitMidi三数取中 整体思想 图解分析 代码实现 Hoare优化 上篇我们介绍了hoare基础版&#xff0c;但是这种代码存在缺陷&#xff0c;所以我们提出了两种解决方案。主流的解决方案就是【三数取中选key】 GitMidi三数取中 在快排的过程中&#xff0c;每一次我们要取一…

Hive--内部表常用操作 全面且详细

文章中关于内部表常用操作目录 一、隔符 二、根据查询结果创建表 ​​​​​​​三、根据已经存在的表结构创建表 ​​​​​​​四、查询表的类型 ​​​​​​​五、删除表 ​​​​​​​一、隔符 create table if not exists stu2(id int ,name string) row format d…

分享:大数据信用查询去什么样的平台查?

在当今社会&#xff0c;大数据信用查询已经成为企业和个人了解自身信用状况的重要途径。然而&#xff0c;面对众多的大数据信用查询平台&#xff0c;如何选择一个可靠的平台进行查询呢?本文将为您介绍一些选择大数据信用查询平台的关键因素。 一、平台信誉度 首先&#xff0c;…

django自定义后端过滤

​ DRF自带的过滤 第一个 DjangoFilterBackend 是需要安装三方库见[搜索&#xff1a;多字段筛选]两外两个是安装注册了rest_framework就有。 如上图&#xff0c;只要配置了三个箭头所指的方向&#xff0c;就能使用。 第一个单字段过滤 用户视图集中加上filterset_fields …
最新文章