多态-虚函数表

news2025/1/12 22:49:29

VS的对象内存分析:

/d reportSingleClassLayout+类名

 使用方法:项目 -- 属性 -- C/C++ -- 命令行--其他选型(D) 添加命令.如图所示:

726c91b663964261b0bfe902afe673e8.png

Father类:

class Father {
public:
	virtual void Func1() { cout << "Father::Func1" << endl; }
	virtual void Func2() { cout << "Father::Func2" << endl; }
	virtual void Func3() { cout << "Father::Func3" << endl; }
	void Func4() { cout << "Father::Func4" << endl; }
public:
	int x = 200;
	int y = 300;
	static int z;
};
int Father::z = 0;

Father的内存分析: 

/d reportSingleClassLayoutFather

 

Son类: public Father

class Son:public Father
{
public:
	void Func1() { cout << "Son::Func1" << endl; }
	virtual void Func5() { cout << "Son::Func5" << endl; }

private:
	int m = 400;
	int n = 500;
};

Son类的内存分析: 

/d reportSingleClassLayoutSon

 

 子类的虚函数表构建过程:

(1)直接复制父类的虚函数表

(2)如果子类重写了父类的某个虚函数,那么就在这个虚函数表中进行相应的替换

 

(3)如果子类中添加了新的虚函数,就把这个虚函数添加到虚函数的表中(在尾部添加)

 

 注意:所有子类共用同一张虚函数表

main函数:

int main(void) {
	Son son;
	Father* father = &son;
	cout << "----Father* father = &son----" << endl;
	son.Func1();
	son.Func2();
	son.Func3();
	son.Func4();
	son.Func5();
	Father* son2 = new Son();
	cout << "----Father* son2 = new Son()----" << endl;
	son2->Func1();
	son2->Func2();
	son2->Func3();
	son2->Func4();
	//son2->Func5();//错误使用
	return 0;
}

结果:

 全部代码(测试):

#include<iostream>
using namespace std;
//vs的对象内存分析:/d1 reportSingleClassLayout+类名
class Father {
public:
	virtual void Func1() { cout << "Father::Func1" << endl; }
	virtual void Func2() { cout << "Father::Func2" << endl; }
	virtual void Func3() { cout << "Father::Func3" << endl; }
	void Func4() { cout << "Father::Func4" << endl; }
public:
	int x = 200;
	int y = 300;
	static int z;
};
int Father::z = 0;

class Son:public Father
{
public:
	void Func1() { cout << "Son::Func1" << endl; }
	virtual void Func5() { cout << "Son::Func5" << endl; }

private:
	int m = 400;
	int n = 500;
};



typedef void(*func)(void);

void test(void) {
	Father father;
	cout << "sizeof(father): " << sizeof(father) << endl;
	cout << "(int*)&father: " << (int*)&father << endl;
	cout << "&father: " << &father << endl;
	int* vptr = (int*)*(int*)(&father);
	cout << "调用虚函数Func1:" << endl;
	((func) * (vptr + 0))();
	cout << "调用虚函数Func2:" << endl;
	((func) * (vptr + 1))();
	cout << "调用虚函数Func3:" << endl;
	((func) * (vptr + 2))();

	cout << "father.x地址: " << endl;
	cout << &father.x << endl;
	cout << (int*)((int)&father + 4) << endl;
	cout << "father.x:" << endl;
	cout << father.x << endl;
	cout << *(int*)((int)&father + 4) << endl;

	cout << "father.y地址: " << endl;
	cout << &father.y << endl;
	cout << (int*)((int)&father + 8) << endl;
	cout << "father.y:" << endl;
	cout << father.y << endl;
	cout << *(int*)((int)&father + 8) << endl;
}

int main(void) {
	test();
	Son son;
	Father* father = &son;
	cout << "----Father* father = &son----" << endl;
	son.Func1();
	son.Func2();
	son.Func3();
	son.Func4();
	son.Func5();
	Father* son2 = new Son();
	cout << "----Father* son2 = new Son()----" << endl;
	son2->Func1();
	son2->Func2();
	son2->Func3();
	son2->Func4();
	//son2->Func5();//错误使用
	return 0;
}

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

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

相关文章

【Redis】亿级数据的收集+清洗+统计+展现

文章目录聚合统计(set->共同好友)排序统计(zset->评论排序)二值统计(bitmap->签到打卡)基数统计(hyperloglog->亿级UV统计方案)地理坐标(GEO)布隆过滤器面试题定义产生背景作用底层原理聚合统计(set->共同好友) 统计多个集合元素的聚合结果&#xff0c;就是前面…

DF竞赛平台助力首届“深水云脑杯”全国智慧水务数据创新大赛圆满落幕

首届“深水云脑杯”全国智慧水务数据创新大赛决赛现场 首届“深水云脑杯”全国智慧水务数据创新大赛已圆满落幕&#xff0c;DataFountain大数据竞赛平台&#xff08;简称DF平台&#xff09;作为官方竞赛平台为本次大赛提供办赛支持。该赛事以数字化创新模式为抓手&#xff0c;…

从零学习SDK(6)调试和测试SDK的库

在前面的文章中&#xff0c;我们介绍了什么是SDK&#xff0c;以及如何选择和接入合适的SDK。在本文中&#xff0c;我们将重点讲解如何调试和测试SDK的库&#xff0c;以确保我们的应用能够正常运行&#xff0c;没有错误或异常。 SDK的库是什么呢&#xff1f;简单来说&#xff0…

DAF Trucks EDI项目案例

DAF Trucks是一家荷兰卡车制造商&#xff0c;通过EDI系统与其供应商和客户之间进行电子交换。DAF Trucks EDI系统包括订单处理、发货通知、发票和付款等功能&#xff0c;能够快速、准确地交换业务文档&#xff0c;提高供应链管理水平。DAF计划将其EDI系统扩展到更多的供应商和客…

JavaScript学习笔记(二)

文章目录第4章&#xff1a;变量、作用域与内存1. 原始值与引用值2. 执行上下文与作用域3. 垃圾回收第5章&#xff1a;基本引用类型1. Date&#xff1a;参考了Java早期版本中的java.util.Date2. RegExp3. 原始值包装类型第6章&#xff1a;集合引用类型1. Object2. Array&#xf…

三电技术之电池管理技术

三电技术之电池管理技术 1 功能概述 电池管理系统 (Battery Management System), 即管理电池的充放电&#xff0c;使电池处于一个最佳的状态。 电池是由多个电芯组成的&#xff0c;每个电芯充放电都是一个电化学反应的过程。无论电芯的制造多精密&#xff0c;随着使用时间、…

OpenText 企业内容管理平台介绍

OpenText 企业内容管理平台介绍 将 ECM 扩展到领先的业务应用程序中&#xff0c;为内容添加上下文&#xff0c;从而提高效率和决策能力 突出优点&#xff1a; 1、企业拥有更多数据、更多来源、更多用途并按需提供 2、员工需要一种新的交互、共享和消费内容的方式 3、更多内容需…

系统分析师冲刺班练习题

系统配置与性能评价---性能指标 吞吐量是指网络、设备、端口、虚拟电路或其他设备&#xff0c;单位时间内成功地传送数据的数量&#xff08;以比特、字节、分组等测量&#xff09; 系统配置与性能评价---性能评价方法 指令执行速度法&#xff1a;在计算机发展的初期&#xff…

【C++】2.C++的输入与输出

文章目录前言一、C的输入\出头文件二、C的输入&输出关键字2.1 输出cout2.2 输入cin三、c输入输出与c语言的输入输出前言 c语言中我们使用scanf,printf等来进行输入、输出操作&#xff0c;在C中我们是否有其他方式呢&#xff1f;答案是有的&#xff0c;下面我们来介绍c的输…

JavaSE学习进阶day05_01 Collection集合概述

第九章 Collection集合 9.1 集合概述 在前面基础班我们已经学习过并使用过集合ArrayList<E> ,那么集合到底是什么呢? 集合&#xff1a;集合是java中提供的一种容器&#xff0c;可以用来存储多个数据。 集合和数组既然都是容器&#xff0c;它们有什么区别呢&#xff1…

快排(动图详细版,快速理解)

注&#xff1a;本文主要介绍六大排序中的快排 文章目录前言一、三大法则1.1 Hoare法1.2 挖坑法1.3 双指针法&#xff08;更加便捷&#xff09;1.4 三种方法时间复杂度计算二、快排栈问题优化方式2.1 三数取中2.2 小区间优化三、非递归快排前言 快速排序是Hoare于1962年提出的一…

生活污水处理设备选购指南

生活污水中含有大量的有机物&#xff08;如蛋白质、碳水化合物、脂肪、尿素、氨氮等&#xff09;及大量的病原微生物&#xff0c;可导致传染病蔓延流行。因此&#xff0c;生活污水在排放前&#xff0c;需要进行处理。那么如何正确的选择生活污水处理设备呢&#xff1f; 一、生活…

移动机器人设计与实践-基础概念汇总

如下全文在关键词提示词等脚本交互下&#xff0c;由文图版本生成式人工智能在1分钟内创作完成。 AI自动生成文章评分已经远超大部分博文评分值。 人类社会经历过农业时代&#xff08;最强代表汉唐&#xff09;-工业时代&#xff08;最强代表日不落帝国&#xff09;-信息时代&a…

利用MyBatis实现CRUD操作

文章目录一、添加按姓名查询用户记录功能1、添加按姓名查询的映射语句2、在用户映射器接口里添加按姓名查询用户记录的方法3、添加按姓名查询用户记录的测试方法4、测试按姓名查询用户记录二、插入表记录1、在UserMapper.xml里增加映射语句 - insert2、在UserMapper接口里增加i…

【三十天精通Vue 3】第七天 Vue 3 响应式系统详解

✅创作者&#xff1a;陈书予 &#x1f389;个人主页&#xff1a;陈书予的个人主页 &#x1f341;陈书予的个人社区&#xff0c;欢迎你的加入: 陈书予的社区 &#x1f31f;专栏地址: 三十天精通 Vue 3 文章目录引言一、Vue 3 响应式系统概述1.1 响应式系统的简介1.2 响应式系统…

【软件设计师14】UML建模

UML建模 稳定出一个&#xff0c;但是由于UML的图比较多&#xff0c;所以这种题比数据流图和数据库难度高 一般都会考用例图和类图&#xff0c;再附加其他的图 1. 用例图 包含关系include&#xff1a;比如登记外借信息必须先有用户登录 扩展关系extend&#xff1a;修改书籍…

C语言--文件操作--一起深入了解文件相关函数的知识

目录前言1.什么是文件1.1程序文件1.2数据文件1.3文件名2.文件的打开与关闭2.1文件指针2.2文件的打开与关闭fopen函数fclose函数3.文件的顺序读写3.1对比一组函数fputc函数fgetc函数fputs函数fgets函数fprintf函数fscanf函数fwrite函数fread函数4.1对比一组函数sprintfsscanf5.文…

ClickUp的最佳替代品,可更好地管理项目

ClickUp 是项目管理类的常见工具&#xff0c;它因团队协作、沟通、免费试用和强大功能等因素受到用户的喜爱。 该工具支持你清晰组织多个项目、进行团队协作并跟踪项目目标的实时进度。不同的视图选项使您能够为所有活动构建完美的工作流程。 尽管它很受欢迎&#xff0c;但用户…

ics-05(命令执行漏洞及伪协议读取)

打开链接&#xff0c;似曾相识的感觉&#xff08;前面做过一道题叫ics-06&#xff0c;那道题是对id的一个爆破&#xff09; 尝试后发现只有设备维护中心可以跳转 这和我们使用御剑扫描出来的结果是一样的 使用PHP伪协议读取 index.php 页面 构造payload&#xff08;在愚人杯ht…

小黑跟尚香一起疯狂星期四,然后慢慢跑回家,生活逐渐明朗,完赛了副中心全程马拉松的leetcode之旅:752. 打开转盘锁

宽度优先搜索法 class Solution:def openLock(self, deadends: List[str], target: str) -> int:# 目的地在死亡数组里if target in deadends:return -1# 起点在死亡数字里if 0000 in deadends:return -1# 起点就是目标字符串if 0000 target:return 0# 定义前向函数def pr…