C++,对于数据结构相同但数据处理方式不同的两种类,可以用虚函数列表地址进行区分和相互转化。

2023-11-05

  举个简单的例子,一个数据可能是整型的,也可能是浮点数。在运行过程中,类型有可能发生变化。如果统一用浮点数表示,那么整型的取值范围就会变小;如果要兼顾整型的取值范围,一般来说,就得使用更多的空间来表示浮点数或者数的类型。

  今天突发奇想,直接用虚函数来进行不同的处理,并且在类型发生变化的时候改变其虚函数列表进行类型转化。

  可以使用new (address) className()来修改虚函数列表地址。



		class Number : public Base
		{//主整型
			friend class NumberDouble;
		private:
			Number(bool) {}
		public:
			Number(__int64 arg);
			Number(double arg);
		public:
			union
			{
				__int64 mDatInt;
				double mDatDouble;
			};
		protected:
			virtual int _getDatInt() const;
			virtual void _setDat(__int64 dat);
			virtual void _setDat(double dat);
		public:
			int getDatInt() const;
			void setDat(__int64 dat);
			void setDat(double dat);
		};



		class NumberDouble : public Number
		{//主浮点数
			friend class Number;
		private:
			NumberDouble(bool arg) :Number(arg) {}
		public:
			NumberDouble(__int64 dat);
			NumberDouble(double dat);
		protected:
			virtual int _getDatInt() const override;
			virtual void _setDat(__int64 dat) override;
			virtual void _setDat(double dat) override;
		};
		Number::Number(__int64 arg)
		{
			this->mDatInt = arg;
		}

		Number::Number(double arg)
		{
			this->_setDat(arg);
		}

		int Number::_getDatInt() const
		{
			return (int)this->mDatInt;
		}
		
		void Number::_setDat(__int64 dat)
		{
			this->mDatInt = dat;
		}

		void Number::_setDat(double dat)
		{
			this->mDatDouble = dat;
			new (this)NumberDouble(false);
		}

		void Number::setDat(__int64 dat)
		{
			this->_setDat(dat);
		}

		void Number::setDat(double dat)
		{
			this->_setDat(dat);
		}

		int Number::getDatInt() const
		{
			return this->_getDatInt();
		}

		
		NumberDouble::NumberDouble(__int64 dat)
			:Number(false)
		{
			this->_setDat(dat);
		}

		NumberDouble::NumberDouble(double dat)
			:Number(false)
		{
			this->mDatDouble = dat;
		}
		
		int NumberDouble::_getDatInt() const
		{
			return (int)this->mDatDouble;
		}
		
		void NumberDouble::_setDat(__int64 dat)
		{
			this->mDatInt = dat;
			new (this)Number(false);
		}

		void NumberDouble::_setDat(double dat)
		{
			this->mDatDouble = dat;
		}

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C++,对于数据结构相同但数据处理方式不同的两种类,可以用虚函数列表地址进行区分和相互转化。 的相关文章

  • IIS应用程序池回收+quartz调度

    我正在 IIS 7 5 上运行一个 Web 应用程序 它需要偶尔回收 否则内存使用情况会失控 这是我正在研究的问题 当它回收时 它实际上不会运行 直到另一个请求到来 而quartz不会运行 有没有办法让IIS在回收应用程序池后立即自动启动1
  • Poco c++Net:Http 从响应中获取标头

    我使用 POCO C Net 库进行 http 我想尝试制定持久缓存策略 首先 我认为我需要从缓存标头中获取过期时间 并与缓存值进行交叉检查 如果我错了 请告诉我 那么我如何从中提取缓存头httpResponse 我已经看到你可以用 Jav
  • 为什么 F# 的默认集合是排序的,而 C# 的不是?

    当从 C 世界迁移到 F 最惯用的可能 思维方式时 我发现了这个有趣的差异 在 C 的 OOP mutable 世界中 默认的集合集合似乎是HashSet https learn microsoft com en us dotnet api
  • 在路由mvc 4中添加公司名称

    我一直在尝试为 Facebook 等用户提供在 URL 中添加公司名称的选项 http localhost 50753 MyCompany Login 我尝试过不同的网址 但没有成功 routes MapRoute name Default
  • 在 Java 中创建 T 的新实例

    在C 中 我们可以定义一个泛型class A
  • 解析 JWT 令牌以仅获取有效负载内容,无需 C# 或 Blazor 中的外部库

    我正在使用 Blazor 编写可以访问 JWT 的客户端应用程序 我想知道一种简单的方法来读取令牌有效负载内容而不添加额外的依赖项 因为我不需要其他信息 也不需要验证令牌 我认为解析有效负载内容应该足够简单 只需将其写入方法即可 JwtTo
  • 从模板切换传递的类型

    在 C 中是否可以检查传递给模板函数的类型 例如 template
  • 如何制作可启动程序?

    所以 这个问题可能看起来很奇怪 但假设我编译了 int main void int x 3 int y 4 int z x y 是否可以让CPU这样运行 如何 例如 这允许我写入监视器吗 如果我没记错的话 内存中有些地方可以写入要显示的内容
  • 计算另一个表达式中的 C# 表达式

    我想在另一个表达式中使用一个表达式 Expression
  • 使用查询表达式对 List 进行排序

    我在使用 Linq 订购这样的结构时遇到问题 public class Person public int ID get set public List
  • MFC:如何设置CEdit框的焦点?

    我正在开发我的第一个简单的 MFC 项目 但我正在努力解决一个问题 想要设置所有的焦点CEdit其中一个对话框中的框 我的想法是 当打开对话框时 焦点位于第一个编辑框上 然后使用 选项卡 在它们之间交换 我看到了方法SetFocus 但我无
  • 根据对象变量搜索对象列表

    我有一个对象列表 这些对象具有三个变量 ID 名称和值 这个列表中可能有很多对象 我需要根据ID或Name找到一个对象 并更改值 例子 class objec public string Name public int UID public
  • UI 函数在快速事件完成之前触发

    我有一个停靠在 Silverlight 应用程序中的 Web 浏览器框架 有时会在其上弹出全窗口 XAML Silverlight UI 元素 我已经或多或少修复了一个老问题 即 Web 框架的内容似乎与 Silverlight 内容不能很
  • 使用具有抗锯齿功能的 C# 更改抗锯齿图像的背景颜色

    我有一个图像需要更改背景颜色 例如 将下面示例图像的背景更改为蓝色 然而 图像是抗锯齿的 所以我不能简单地用不同的颜色替换背景颜色 我尝试过的一种方法是创建第二个图像 仅作为背景 并更改其颜色并将两个图像合并为一个图像 但是这不起作用 因为
  • 英文日期差异

    接近重复 如何计算相对时间 https stackoverflow com questions 11 how do i calculate relative time 如何在 C 中计算某人的年龄 https stackoverflow c
  • ASP.NET MVC 路由:如何从 URL 中省略“索引”

    我有一个名为 StuffController 的控制器 具有无参数索引操作 我希望从表单中的 URL 调用此操作mysite com stuff 我的控制器定义为 public class StuffController BaseContr
  • C++ 中 void(*)() 和 void(&)() 之间的区别[重复]

    这个问题在这里已经有答案了 在此示例代码中 func1是类型void int double and funky是类型void int double include
  • 需要提取字符串中点后的最后一个数字,如“7.8.9.1.5.1.100”

    我需要提取 C 字符串中最后一个点后面的最后一个数字 例如 7 8 9 1 5 1 100 并将其存储在整数中 Added 该字符串也可以是 7 8 9 1 5 1 1 或 7 8 9 1 5 1 0 我还想验证它在最后一个点之前恰好是 7
  • 如何得知客户端从服务器的下载速度?

    根据客户的下载速度 我想以低质量或高质量显示视频 任何 Javascript 或 C 解决方案都是可以接受的 Thanks 没有任何办法可以确定 您只能测量向客户端发送数据的速度 如果没有来自客户端的任何类型的输入来表明其获取信息的速度 您
  • 结构化绑定的用例有哪些?

    C 17 标准引入了新的结构化绑定 http en cppreference com w cpp language structured binding功能 最初是proposed http www open std org jtc1 sc

随机推荐

  • vant组件库中toast非正常显示,出现白底

    参考链接 原 原代码 showLoadingToast message 加载中 forbidClick true className particulars detail popup 解决方法 给toast添加样式覆盖原有样式 新代码 sh
  • 时间序列分析:指数平滑与ARIMA模型

    时间序列是指 将某种现象的指标数值按照时间顺序排列而成的数值序列 时间序列分析可以分成三大部分 描述过去 分析过去和预测未来 目录 1 时间序列基本概念 2 时间序列分解 2 1 长期趋势 T Secular trend 2 2 季节趋势
  • XSS-labs靶场实战(二)——第4-6关

    今天继续给大家介绍渗透测试相关知识 本文主要内容是XSS labs靶场实战第4 6关 免责声明 本文所介绍的内容仅做学习交流使用 严禁利用文中技术进行非法行为 否则造成一切严重后果自负 再次强调 严禁对未授权设备进行渗透测试 一 第四关 我
  • 安装和使用Atom编辑器

    atom编辑器是一个Github出品的现代的 可扩展的编辑器 和古老的Vim Emacs相比 atom具有诸多优点 一是出现较晚 可以使用最新出现的各种技术 二来atom使用web技术构建而成 广大的web开发者可以很容易的为atom编写扩
  • shell脚本指定环境启动jar包

    路径说明 opt路径下配置脚本api run sh 并在该路径下创建文件夹envment 上传jar包至envment下 opt api run sh envment java jar 启动命令 sh opt api run sh rest
  • 【第19例】IPD开发流程

    目录 前言 专栏目录 详细内容 华为流程体系列表 CSDN学院 作者简介 前言 今天 IPD体系进阶100例 就更新到了第 19 例 在 第16例 中讲到了 IPD
  • Slowloris dos攻击的原理及防护

    反射攻击已经成为DDoS攻击的主要方式 在一些博客中也有论述 最为常用的当属ddos反射放大攻击 但是如今 受政策影响 反射式攻击放缓 2018年 平均每个月反射攻击下降了0 93万次 非反射攻击增加了0 35万次 Slowloris do
  • 计算机网络 IP多播

    IP 多播的基本概念 IP 多播 multicast 以前曾译为组播 已成为互联网的一个热门课题 目的 更好地支持一对多通信 一对多通信 一个源点发送到许多个终点 例如 实时信息的交付 如新闻 股市行情等 软件更新 交互式会议及其他多媒体通
  • vue 列表中默认显示几条数据,点击展示全部

    思路 1 获取接口数据的时候 给每一条数据都新增一个showmore false 变量 2 显隐展示 新增一个常量默认展示几条 判断showmore false 展示几条 为true展示全部 3 点击每一项的时候 展示隐藏问题 使用this
  • 第一篇 Spring Cloud Alibaba入门

    1 为什么会出现Spring Cloud Alibaba 1 1Spring Cloud Netflix项目进入维护模式 官网说明地址 https spring io blog 2018 12 12 spring cloud greenwi
  • 目标检测任务简述

    目标检测竟然也可以说是一个比较上游的任务了 以此为基础的下游任务可以是环境感知 自动驾驶 人体关键点检测等 与图像分类的区别 目标检测物体数量不固定 位置不固定 大小不固定 分类一般都是一张图片中是一个物体 位置在正中间 大小占整张图片的大
  • 腾讯云服务器opencloudos8.6 安装 redis

    下载 先检查安装redis的gcc环境有没有 说明gcc已经自己就装有了 下面是安装gcc 的指令 除了这个之外 也可以使用 gcc安装 yum y install gcc automake autoconf libtool make 自动
  • c++11 std::lock函数模板总结

    一 std lock概念 可以一次锁住两个或者两个以上的互斥量 最少锁两个 优点 它不存在这种因为多个线程中因为锁的顺序问题导致死锁的风险问题 std lock 不会存在死锁的原因 比如std lock g i mutex g j mute
  • STL ---- list 使用

    目录 初始化 追加和删除 迭代器 常用的常量 插入数据 删除数据 其他函数 初始化 使用assign函数初始化 l num assign 3 5 l data assign 1 2 3 4 或者定义的时候就初始化 list
  • sqlilab学习打卡

    less 46 order by 如题 显然这一类题目的注入点在order by处 分别测试了sort 1 2 3 4 发现有回显有报错信息 不过这一关回显的内容不是可以被利用的地方 因此只能使用报错注入 盲注 因为之前从来没有接触过这类
  • Unity3D中的Coroutine详解

    本文太乱 推荐frankjfwang的 全面解析Coroutine技术 Unity中的coroutine是通过yield expression 来实现的 官方脚本中到处会看到这样的代码 疑问 yield是什么 Coroutine是什么 un
  • ESXI 中的虚拟机导出到本地

    ovftool exe工具 在windows如已经安装vmware workstation 在安装目录下有个OVFTool目录直接可使用 例如 C Program Files x86 VMware VMware Workstation OV
  • circos - Session 2 - Lesson 2 - Histograms

    create data track draw a histogram which is a plot type track Two kinds of data tracks plots and links create an image w
  • c/c++游戏逆向驱动开发,游戏辅助保护盾

    功能介绍 1 降低游戏权限 提升游戏权限 禁止游戏后台截图 2 保护进程 隐藏进程 进程内存不被读取 如图 部分功能展示 程序降权 NTSTATUS ChangeHandleAccessState ULONG ulProcessId ULO
  • C++,对于数据结构相同但数据处理方式不同的两种类,可以用虚函数列表地址进行区分和相互转化。

    举个简单的例子 一个数据可能是整型的 也可能是浮点数 在运行过程中 类型有可能发生变化 如果统一用浮点数表示 那么整型的取值范围就会变小 如果要兼顾整型的取值范围 一般来说 就得使用更多的空间来表示浮点数或者数的类型 今天突发奇想 直接用虚