【C++】多态、黑马程序员案例— —电脑组装、Visual Studio开发人员工具查看内部结构,cl /d1 reportSingleClassLayout

author:&Carlton

tag:C++

topic:【C++】多态、黑马程序员案例— —电脑组装、Visual Studio开发人员工具查看内部结构,cl /d1 reportSingleClassLayout

website:黑马程序员C++

date:2023年7月24日


目录

纯虚函数、抽象类

案例— —电脑组装

抽象类(父类):CPU、显卡、内存条

零件厂商类(子类):Intel、Amd

电脑类:零件搭配,零件工作调用

三个测试对象(电脑对象)

源代码

运行结果

虚函数作用效果与内部结构变化

运行结果变化 

内部结构变化


纯虚函数、抽象类

        类中只要有一个纯虚函数那这个类就是抽象类,不能实例化对象,而且它的子类必须重写纯虚函数,否则也为抽象类。

案例— —电脑组装

抽象类(父类):CPU、显卡、内存条

//抽象CPU类
class AbstractCPU
{
public:
	virtual void calculate() = 0;		//纯虚函数
};

//抽象显卡类
class AbstractVideoCard
{
public:
	virtual void display() = 0;	
};

//抽象内存条类
class AbstractMemory
{
public:
	virtual void storage() = 0;		
};

零件厂商类(子类):Intel、Amd

//Intel厂商CPU类
class IntelCPU:public AbstractCPU
{
public:
	void calculate()		//函数重写
	{
		cout << "Intel的CPU在工作" << endl;
	}
};

//Intel厂商显卡类
class IntelVideoCard :public AbstractVideoCard
{
public:
	void display()	
	{
		cout << "Intel的显卡在工作" << endl;
	}
};

//Intel厂商内存条类
class IntelMemory :public AbstractMemory
{
public:
	void storage()
	{
		cout << "Intel的内存条在工作" << endl;
	}
};

//Amd厂商CPU类
class AmdCPU :public AbstractCPU
{
public:
	void calculate()
	{
		cout << "Amd的CPU在工作" << endl;
	}
};

//Amd厂商显卡类
class AmdVideoCard :public AbstractVideoCard
{
public:
	void display()
	{
		cout << "Amd的显卡在工作" << endl;
	}
};

//Amd厂商内存条类
class AmdMemory :public AbstractMemory
{
public:
	void storage()
	{
		cout << "Amd的内存条在工作" << endl;
	}
};

电脑类:零件搭配,零件工作调用

//电脑类
class Computer
{
public:

	//使用父类指针定义子类对象
	AbstractCPU* m_cpu;
	AbstractVideoCard* m_videocard;
	AbstractMemory* m_memory;
	
	//初始化搭配零件
	Computer(AbstractCPU* cpu,AbstractVideoCard* videocard,AbstractMemory* memory)
	{
		m_cpu = cpu;
		m_videocard = videocard;
		m_memory = memory;
	}
	
	//电脑工作函数
	//调用三个零件
	void work()
	{
		m_cpu->calculate();
		m_videocard->display();
		m_memory->storage();
	}
};

三个测试对象(电脑对象)

//组装第一台电脑
void test01()
{
	cout << "第一台电脑在工作:" << endl;

	//建立子类指针指向堆区内存区
	IntelCPU* cpu = new (IntelCPU);
	IntelVideoCard* videocard = new (IntelVideoCard);
	IntelMemory* memory = new (IntelMemory);

	Computer c1(cpu, videocard, memory);
	c1.work();

	delete cpu;
	delete videocard;
	delete memory;
}

//组装第二台电脑
void test02()
{
	cout << "第二台电脑在工作:" << endl;

	AmdCPU* cpu = new (AmdCPU);
	AmdVideoCard* videocard = new (AmdVideoCard);
	AmdMemory* memory = new (AmdMemory);

	Computer c1(cpu, videocard, memory);
	c1.work();

	delete cpu;
	delete videocard;
	delete memory;
}

//组装第三台电脑
void test03()
{
	cout << "第三台电脑在工作:" << endl;

	IntelCPU* cpu = new (IntelCPU);
	AmdVideoCard* videocard = new (AmdVideoCard);
	IntelMemory* memory = new (IntelMemory);

	Computer c1(cpu, videocard, memory);
	c1.work();

	delete cpu;
	delete videocard;
	delete memory;
}

源代码

#include <iostream>
using namespace std;

//抽象CPU类
class AbstractCPU
{
public:
	virtual void calculate() = 0;		//纯虚函数
};

//抽象显卡类
class AbstractVideoCard
{
public:
	virtual void display() = 0;	
};

//抽象内存条类
class AbstractMemory
{
public:
	virtual void storage() = 0;		
};

//Intel厂商CPU类
class IntelCPU:public AbstractCPU
{
public:
	void calculate()		//函数重写
	{
		cout << "Intel的CPU在工作" << endl;
	}
};

//Intel厂商显卡类
class IntelVideoCard :public AbstractVideoCard
{
public:
	void display()	
	{
		cout << "Intel的显卡在工作" << endl;
	}
};

//Intel厂商内存条类
class IntelMemory :public AbstractMemory
{
public:
	void storage()
	{
		cout << "Intel的内存条在工作" << endl;
	}
};

//Amd厂商CPU类
class AmdCPU :public AbstractCPU
{
public:
	void calculate()
	{
		cout << "Amd的CPU在工作" << endl;
	}
};

//Amd厂商显卡类
class AmdVideoCard :public AbstractVideoCard
{
public:
	void display()
	{
		cout << "Amd的显卡在工作" << endl;
	}
};

//Amd厂商内存条类
class AmdMemory :public AbstractMemory
{
public:
	void storage()
	{
		cout << "Amd的内存条在工作" << endl;
	}
};

//电脑类
class Computer
{
public:

	//使用父类指针定义子类对象
	AbstractCPU* m_cpu;
	AbstractVideoCard* m_videocard;
	AbstractMemory* m_memory;
	
	//初始化搭配零件
	Computer(AbstractCPU* cpu,AbstractVideoCard* videocard,AbstractMemory* memory)
	{
		m_cpu = cpu;
		m_videocard = videocard;
		m_memory = memory;
	}
	
	//电脑工作函数
	//调用三个零件
	void work()
	{
		m_cpu->calculate();
		m_videocard->display();
		m_memory->storage();
	}
};

//组装第一台电脑
void test01()
{
	cout << "第一台电脑在工作:" << endl;

	//建立子类指针指向堆区内存区
	IntelCPU* cpu = new (IntelCPU);
	IntelVideoCard* videocard = new (IntelVideoCard);
	IntelMemory* memory = new (IntelMemory);

	Computer c1(cpu, videocard, memory);
	c1.work();

	delete cpu;
	delete videocard;
	delete memory;
}

//组装第二台电脑
void test02()
{
	cout << "第二台电脑在工作:" << endl;

	AmdCPU* cpu = new (AmdCPU);
	AmdVideoCard* videocard = new (AmdVideoCard);
	AmdMemory* memory = new (AmdMemory);

	Computer c1(cpu, videocard, memory);
	c1.work();

	delete cpu;
	delete videocard;
	delete memory;
}

//组装第三台电脑
void test03()
{
	cout << "第三台电脑在工作:" << endl;

	IntelCPU* cpu = new (IntelCPU);
	AmdVideoCard* videocard = new (AmdVideoCard);
	IntelMemory* memory = new (IntelMemory);

	Computer c1(cpu, videocard, memory);
	c1.work();

	delete cpu;
	delete videocard;
	delete memory;
}

int main()
{
	test01();
	cout << "---------------" << endl;
	test02();
	cout << "---------------" << endl;
	test03();
	return 0;
}

运行结果

 

虚函数作用效果与内部结构变化

更改抽象CPU类的calculate函数,不使用虚函数

运行结果变化 

        ”CPU不再工作“,不再打印CPU在工作的这一句话,说明此时即便父类指针指向子类对象,但由于没有在父类(即这里的抽象类)上用virtual关键字修饰使用虚函数,没有完成运行多态,对象调用的是父类的calculate函数(即一个空函数)

 

内部结构变化

使用virtual修饰: 

不适用虚函数后:

 

欢迎指正与分享,谢谢!

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

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

相关文章

【Spring】什么是Bean的生命周期及作用域,什么是Spring的执行流程?

博主简介&#xff1a;想进大厂的打工人博主主页&#xff1a;xyk:所属专栏: JavaEE进阶 在前面的播客中讲解了如何从Spring中存取Bean对象&#xff0c;那么本篇我们来讲解Bean对象的生命周期是什么&#xff0c;Bean对象的6种作用域分别是什么&#xff0c;都有哪些区别&#xff…

7年经验之谈 —— 浅谈web性能测试

什么是性能测试&#xff1f; web性能应该注意些什么&#xff1f; 性能测试&#xff0c;简而言之就是模仿用户对一个系统进行大批量的操作&#xff0c;得出系统各项性能指标和性能瓶颈&#xff0c;并从中发现存在的问题&#xff0c;通过多方协助调优的过程。而web端的性能测试…

高效协作处理缓存清理需求:生产者-消费者模式助力多模块缓存管理

在现代应用系统中&#xff0c;缓存是提高性能和减少数据库负载的重要手段之一。然而&#xff0c;缓存的数据在某些情况下可能会过期或者变得无效&#xff0c;因此需要及时进行清理。在复杂的应用系统中&#xff0c;可能有多个系统、多个模块产生缓存清理需求&#xff0c;而这些…

【LeetCode】剑指 Offer Ⅱ 第1章:整数(5道题) -- Java Version

题库链接&#xff1a;https://leetcode.cn/problem-list/e8X3pBZi/ 题目解决方案剑指 Offer II 001. 整数除法快速除 ⭐剑指 Offer II 002. 二进制加法模拟&#xff1a;StringBuilder ⭐剑指 Offer II 003. 前 n 个数字二进制中 1 的个数动规&#xff1a;res[i] res[i & (…

【组内工作】木马回联

文章目录 C2服务器安装和运行方法CrossC2运行方法sliver运行方法empire安装方法DeimosC2安装教程TrevorC2安装教程&#xff1a; C2服务器的流量特征CrossC21. 心跳包2. 命令3. ja3/ja3s Sliver1. http2. https empirehttphttps DeimosC2https TrevorC2 C2服务器安装和运行方法 …

C\C++内存管理

目录 1.C/C内存分布2.C语言中动态内存管理方式3.C中动态内存管理3.1new/delete内置类型3.2new和delete操作自定义类型 4.operator new与operator delete函数4.2重载operator new与operator delete&#xff08;了解&#xff09; 5.new和delete的实现原理5.1内置类型5.2 自定义类…

2023亚马逊云科技中国峰会——Amazon DeepRacer

1.DeepRacer技术背景 早在20世纪初汽车问世之时&#xff0c;发明家们便已提出无人驾驶的设想。但即便是实现无人驾驶的初级阶段&#xff0c;也经历了足足百年时间。毕竟在复杂的城市路况下&#xff0c;机器若想像人一样实现感知、决策、控制等功能&#xff0c;必定面临各种复杂…

每日一博 - How To Improve API Performance

文章目录 包括但局限于以下措施1. 采用分页显示2. 异步记录日志3. 利用缓存技术4. 实施负载压缩5. 管理数据库连接池 包括但局限于以下措施 1. 采用分页显示 当查询结果过多时&#xff0c;将结果分为多个页面进行显示&#xff0c;可以有效地提高系统的响应速度。这样&#xff…

IntelliJ IDEA 2023.2 主要更新了什么?(纯文本介绍版)

&#x1f337;&#x1f341; 博主猫头虎 带您 Go to New World.✨&#x1f341; &#x1f984; 博客首页——猫头虎的博客&#x1f390; &#x1f433;《面试题大全专栏》 文章图文并茂&#x1f995;生动形象&#x1f996;简单易学&#xff01;欢迎大家来踩踩~&#x1f33a; &a…

empty module导致的lvs问题

write_verilog时-exclude empty_modules即可 这里也分享一下ICC2 write lvs netlist的命令 write_verilog -exclude {scalar_wire_declarations leaf_module_declarations empty_modules well_tap_cells filler_cells supply_statements} -hierarchy all -force_no_referenc…

Spring MVC 是什么?

一、什么是 Spring MVC&#xff1f; 官方对于 Spring MVC 的描述是这样的&#xff1a; Spring Web MVC is the original web framework built on the Servlet API and has been included in the Spring Framework from the very beginning. The formal name, “Spring Web …

信息安全战线左移!智能网联汽车安全亟需“治未病”

当汽车由典型的工业机械产品逐步发展成为全新的智能移动终端&#xff0c;汽车的安全边界发生了根本性改变&#xff0c;信息安全风险和挑战不断增加。 面对复杂的异构网络、异构系统及车规级特异性要求&#xff0c;智能智能网联汽车信息安全到底要如何防护&#xff0c;已经成为…

【Linux】POSIX信号量

1 认识信号量 前面的初识信号量 信号量&#xff08;信号灯&#xff09;&#xff1a;本质就是一个计算器信号量需要进行PV操作&#xff0c;P -- &#xff1b;V &#xff0c;原子的&#xff01;信号量是用来描述临界资源中资源数目的 根据资源数目分成两类一个资源&#xff…

JVM类加载

一、类记载过程 1、通过类的全限定名获取存储该类的class文件 2、解析成运行时数据&#xff0c;即instanceKlass实例&#xff0c;存放到方法区 3、在堆区生成该类的class对象,即instanceMirrorKlass实例 二、将.class文件解析成什么&#xff1f;类的元信息在JVM中如何…

IOS UICollectionView 设置cell大小不生效问题

代码设置flowLayout.itemSize 单元格并没有改变布局大小&#xff0c; 解决办法如下图&#xff1a;把View flow layout 的estimate size 设置为None&#xff0c;上面设置的itemSize 生效了。

系统架构设计师-软件架构设计(5)

目录 一、构件与中间件技术 1、软件复用 2、构件与中间件技术的概念 3、构件的复用 3.1 检索与提取构件 3.2 理解与评价构件 3.3 修改构件 3.4 组装构件 4、中间件 4.1 采用中间件技术的优点&#xff1a; 4.2 中间件的分类&#xff1a; 5、构件标准 5.1 CORBA&#xff08;公共…

【弹力设计篇】弹力设计总结

前面主要聊了多个弹力设计&#xff0c;遮盖力主要做一个汇总 弹力设计总图 集群&#xff1a;服务不能是单点的&#xff0c;所以我们的架构需要冗余设计&#xff0c;设计成集群服务&#xff0c;也就是多个副本机制。需要具体的技术 负载均衡服务健康检查&#xff0c;使用像Ng…

【单谐波非线性振动问题求解器 GUI 】使用单个谐波表示解决 MDOF 非线性振动问题(Matlab代码实现)

目录 &#x1f4a5;1 概述 &#x1f4da;2 运行结果 &#x1f389;3 参考文献 &#x1f308;4 Matlab代码实现 &#x1f4a5;1 概述 对于解决多自由度&#xff08;MDOF&#xff09;非线性振动问题&#xff0c;使用单个谐波表示是一种常见的近似方法。这种方法将系统的非线性部…

使用3ds Max粒子系统创建飞天箭雨特效场景

推荐&#xff1a; NSDT场景编辑器助你快速搭建可二次开发的3D应用场景 1. 设置箭头 步骤 1 打开 3ds Max。 打开 3ds Max 步骤 2 我使用多边形建模技术制作了一个简单的箭头&#xff0c;我将 在教程中使用。.max您可以从 下载部分。 箭头.max 步骤 3 将此箭头重命名为静态…

Stability AI推出Stable Diffusion XL 1.0,文本到图像模型

Stability AI宣布推出Stable Diffusion XL 1.0&#xff0c;这是一个文本到图像的模型&#xff0c;该公司将其描述为迄今为止“最先进的”版本。 Stability AI表示&#xff0c;SDXL 1.0能生成更加鲜明准确的色彩&#xff0c;在对比度、光线和阴影方面做了增强&#xff0c;可生成…