c++远征之多态篇——运行时类型识别(RTTI)

以下内容源于慕课网的学习整理,如有侵权,请告知删除。


1、RTTI(Run-Time Type Information),运行时类型识别。

  • 涉及typeid、dynamic_cast这两个知识点。
  • RTTI技术可以通过父类指针,识别其所指向对象的真实数据类型。


2、如下面的例子

  • 首先是一些类的定义






  • 我们希望在一个函数里,根据不同的类的对象,进行不同的操作,如下
  • 涉及到了typeid和dynamic_cast的用法。





3、上面例子的细节

(1)dynamic_cast的注意事项

  • 只能应用于指针和引用的转换,即()中是指针或者引用;
  • 要转换的类型中必须包含虚函数,即< >中所对应的类中应该包含虚函数。
  • 转换成功返回子类的地址,失败返回NULL。即< >中的类,应该是()中的类的子类。

(2)typeid的注意事项

  • typeid返回一个type_info对象的引用;
  • 如果想要通过基类的指针获得派生类的数据类型,基类必须带有虚函数。
  • 只能获取对象的实际类型。
  • 上面代码中*obj表示一个对象的类型?比如是Bird或者Plane类型。
  • 因此typeid(*obj).name()得到类型,如Bird或者Plane。




4、代码示例

#include <iostream>
#include <stdlib.h>
#include <string>
#include <typeinfo>
using namespace std;/*** 定义移动类:Movable* 纯虚函数:move*/
class Movable
{
public:virtual void move()=0;
};/*** 定义公交车类:Bus* 公有继承移动类* 特有方法carry*/
class Bus : public Movable
{
public:virtual void move(){cout << "Bus -- move" << endl;}virtual void carry(){cout << "Bus -- carry" << endl;}
};/*** 定义坦克类:Tank* 公有继承移动类* 特有方法fire*/
class Tank :public Movable
{
public:virtual void move(){cout << "Tank -- move" << endl;}virtual void fire(){cout << "Tank -- fire" << endl;}
};/*** 定义函数doSomething含参数* 使用dynamic_cast转换类型*/
void doSomething(Movable *obj)
{obj->move();if(typeid(*obj)==typeid(Bus)){Bus *bus=dynamic_cast<Bus*>(obj);bus->carry();}if(typeid(*obj)==typeid(Tank)){Tank* tank=dynamic_cast<Tank*>(obj);tank->fire();}
}int main(void)
{Bus b;Tank t;doSomething(&b);doSomething(&t);return 0;
}



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

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

相关文章

用c#写的一个局域网聊天客户端 类似小飞鸽

最后在公司实习&#xff0c;新人不给活干&#xff0c;就自己随便看看&#xff0c;了解一些DevExpress控件啊&#xff0c;编码规范啊之类的&#xff0c;自己就寻思着写一点点小东西练习练习 出于自己对c# socket这块不熟&#xff0c;就选择了这块&#xff0c;顺便可以进一步了解…

c++远征之多态篇——异常处理

以下内容源于慕课网的学习整理&#xff0c;如有侵权&#xff0c;请告知删除。 1、关于异常的一些概念 异常&#xff1a;程序运行期出现的错误。 数组下标越界&#xff1b;除数为0&#xff1b;内存不足&#xff1b;…… 异常处理&#xff1a;对有可能发生异常的地方做出预见性的…

图像传感器之CMOS(2)

转&#xff1a;http://www.elecfans.com/application/Military_avionics/2013/0531/319531.html 提高宇航级图像传感器生产能力 日前&#xff0c;在能量效率方面不断创新的安森美半导体公司已同斯坦福国际研究院&#xff08;SRI&#xff09;和波尔航天科技公司合作&#xff0c;…

c++远征之模板篇——友元函数、友元类

以下内容源于慕课网的学习整理&#xff0c;如有侵权&#xff0c;请告知删除。 一、友元函数 1、分类 全局函数——》友元全局函数 成员函数——》友元成员函数 2、关键字friend 友元全局函数 如下&#xff0c;利用friend修饰的函数&#xff0c;其参数应该是本类的引用或者指…

PHP通过session判断防止表单重复提交实例

PHP通过session判断防止表单重复提交实例 PHP通过session判断防止表单重复提交实例&#xff0c;当用户提交表单后&#xff0c;为防止重复操作&#xff0c;通过session来判断是否为初次提交&#xff0c;否则让他返回到之前表单页面。 当前表单页面is_submit设为0 1 SESSION_STAR…

c++远征之模板篇——静态数据成员,静态成员函数

以下内容源于慕课网的学习整理&#xff0c;如有侵权&#xff0c;请告知删除。 1、静态数据成员 &#xff08;1&#xff09;不同于普通的数据成员&#xff0c;静态数据成员在没有实例化时&#xff0c;它也是存在的&#xff08;即它是和类共存的&#xff09;&#xff1b; &…

c++远征之模板篇——运算符重载

以下内容源于慕课网的学习整理&#xff0c;如有侵权&#xff0c;请告知删除。 一、运算符重载的概念 给原有的运算符赋予新的功能。比如下面的截图&#xff0c;本来加号并不具备坐标的相加的功能&#xff0c;但是通过运算符重载可以实现该功能。 二、运算符重载的本质 本质是…

frp对http协议应用

前言 frp是一个开源的项目, 可用于内网穿透的高性能的反向代理应用&#xff0c;支持 tcp, udp 协议&#xff0c;为 http 和 https 应用协议提供了额外的能力&#xff0c;且尝试性支持了点对点穿透。 github地址&#xff1a;https://github.com/fatedier/frp 此处对http的应用做…

树形列(无限级联下拉列的曲线版本)

先上效果图&#xff1a; 1、列表 - 列表设置 - 创建栏&#xff0c;“类型”选择“托管元数据”&#xff0c;如下图&#xff1a; 2、选中“托管元数据”后&#xff0c;可以到下面编辑需要的树形啦&#xff1a; 3、编辑好&#xff0c;确定&#xff0c;搞定&#xff1b;可以到列表…

c++远征之模板篇——函数模板、类模板

以下内容源于慕课网的学习整理&#xff0c;如有侵权&#xff0c;请告知删除。 函数模板&#xff08;vs模板函数&#xff09; 1、为什么需要模板&#xff1f; 函数体相同&#xff0c;只是类型不一样而已。那么能否把数据的类型当做参数传递呢&#xff1f;肯定是可以的&#xff0…

c++远征之模板篇——标准模板库(STL)

以下内容源于慕课网的学习整理&#xff0c;如有侵权&#xff0c;请告知删除。 常见的设计模板 1、vector&#xff0c;向量 &#xff08;1&#xff09;本质是对数组的封装&#xff1b; &#xff08;2&#xff09;能够在常数时间内完成读取&#xff1b; &#xff08;3&#xf…

数据结构探险——队列篇

以下内容源于慕课网的学习整理&#xff0c;如有侵权&#xff0c;请告知删除。 1、什么是队列&#xff1f; &#xff08;1&#xff09;先入先出的模型&#xff08;FIFO&#xff09;。 &#xff08;2&#xff09;队头&#xff0c;队尾。 &#xff08;3&#xff09;细分为普通队…

数据结构与算法之冒泡排序

转载于:https://www.cnblogs.com/yakun/p/3634457.html

数据结构探险——栈篇

以下内容源于慕课网的学习整理&#xff0c;如有侵权&#xff0c;请告知删除。 1、栈要素 栈底&#xff08;不变&#xff09;、栈顶&#xff08;随着入栈和出栈而改变&#xff09; 2、栈机制的实现 &#xff08;1&#xff09;栈的相关机制 判断栈的空满&#xff1b;入栈、出栈…

windows下修改tomcat的startup.bat脚本文件后台运行

1、修改startup.bat文件 rem Get remaining unshifted command line arguments and save them in the set CMD_LINE_ARGS :setArgs if ""%1"""""" goto doneSetArgs set CMD_LINE_ARGS%CMD_LINE_ARGS% %1 shift goto setArgs :doneSet…

开源框架:CocoaPods 安装学习教程

转载 开源框架:CocoaPods 引言: CocoaPods是一个可以帮你集中管理第三方库的开源项目,运行在Ruby的环境下,基于GitHub托管优势,你可以很方便的查阅目前依赖于CocoaPods的资源. 并且,CocoaPods是可靠,稳定,安全的.可以为你在使用第三方库资源时节省大部分的配置和部署时间.更专心…

SESSION 回收机制

session.gc_maxlifetime session.gc_probability session.gc_divisor session.gc_divisor 与 session.gc_probability 合起来定义了在每个会话初始化时启动 gc&#xff08;garbage collection 垃圾回收&#xff09;进程的概率。此概率用 gc_probability/gc_divisor 计算得来…

数据结构探险——线性表篇

以下内容源于慕课网的学习整理&#xff0c;如有侵权&#xff0c;请告知删除。 1、线性表 概念 机制的实现 2、顺序表 构造函数、析构函数 清空线性表&#xff0c;判空 求当前线性表长度&#xff0c;获取某个序号的元素 定位某个元素的位置 找前驱&#xff08;找后驱类似的&…

Mysql优化之执行计划查看

我们经常说到mysql优化&#xff0c;优化中一种常见的方式就是对于经常查询的字段创建索引。那么mysql中有哪些索引类型呢&#xff1f; 一、索引分类1、普通索引&#xff1a;即一个索引只包含单个列&#xff0c;一个表可以有多个单列索引 2、唯一索引&#xff1a;索引列的值必须…

jmeter+Fiddler:通过Fiddler抓包生成jmeter脚本

Fiddler是目前最常用的抓包工具之一&#xff0c;它作为客户端和服务器端之间的代理&#xff0c;记录客户端和服务器之间的所有请求(http/https)&#xff0c;可以针对特定的请求过滤&#xff0c;分析请求和响应的数据、设置断点、调试、修改请求的数据&#xff0c;甚至可以修改服…