RTTI, RunTime Type Information, 运行时类型信息, 是多态的主要组成部分, 
通过运行时(runtime)确定使用的类型, 执行不同的函数,复用(reuse)接口.
dynamic_cast<>可以 使基类指针转换为派生类的指针, 通过判断指针的类型, 可以决定使用的函数.
typeid(), 可以判断类型信息, 判断指针指向位置, 在多态中, 可以判断基类还是派生类.

代码:

/*

* test.cpp

*

*  Created on: 2014.04.22

*      Author: Spike

*/

/*eclipse cdt, gcc 4.8.1*/

#include <iostream>

#include <typeinfo>

using namespace std;

class Base {

public:

virtual void fcnA() {

std::cout << "base" << std::endl;

}

};

class Derived : public Base {

public:

virtual void fcnB() {

std::cout << "derived" << std::endl;

}

};

void fcnC(Base* p) {

Derived* dp = dynamic_cast<Derived*>(p);

if (dp != NULL)

dp->fcnB();

else

p->fcnA();

}

void fcnD(Base* p) {

if (typeid(*p) == typeid(Derived)) {

Derived* dp = dynamic_cast<Derived*>(p);

dp->fcnB();

} else

p->fcnA();

}

int main(void) {

Base* cp = new Derived;

std::cout << typeid(cp).name() << std::endl;

std::cout << typeid(*cp).name() << std::endl;

std::cout << typeid(&(*cp)).name() << std::endl;

fcnC(cp);

fcnD(cp);

Base* dp = new Base;

fcnC(dp);

fcnD(dp);

return 0;

}

输出:

P4Base
7Derived
P4Base
derived
derived
base
base
以上代码只是示例,

具体使用时, 避免使用dynamic_cast<>和typeid()去判断类型, 直接通过多态即可.
注意多态的绑定只能通过指针, 如fcnC(Base*), 或引用, 如fcnD(Base&), 实现动态绑定,
 两者效果相同;
都会根据输入的类型,动态绑定虚函数(virtual function).
--------------------- 
作者:SpikeKing 
来源:CSDN 
原文:https://blog.csdn.net/caroline_wendy/article/details/24369987 
版权声明:本文为博主原创文章,转载请附上博文链接!

C++ - RTTI(RunTime Type Information)运行时类型信息 详解相关推荐

  1. wxWidgets:运行时类型信息 (RTTI)

    wxWidgets:运行时类型信息 (RTTI) wxWidgets:运行时类型信息 (RTTI) 类信息 RTTI例子 wxWidgets:运行时类型信息 (RTTI) C++ 的一个缺点曾经是没有 ...

  2. [面试] C/C++ 语法(六)—— RTTI(运行时类型信息)

    RTTI(RunTime Type Information),顾名思义,对象运行时类型信息,以便在运行时进行类型识别. C++ 的对象识别可通过以下三个技术得以实现: (1)dynamic_cast ...

  3. C++-运行时类型信息,异常(day11)

    一.运行时类型信息 1.typeid运算符 头文件:#include<typeinfo> C++的标准头文件,都对应相应的类 //sizeof(类型/变量/表达式),返回内存大小 type ...

  4. WCF服务端运行时架构体系详解[下篇]

    作为WCF中一个核心概念,终结点在不同的语境中实际上指代不同的对象.站在服务描述的角度,我们所说的终结点实际上是指ServiceEndpoint对象.如果站在WCF服务端运行时框架来说,终结点实际上指 ...

  5. Java JVM内存模型(运行时数据区域)详解

    详细介绍了JVM运行时数据区域,包括方法区.堆空间.栈空间.本地方法栈.程序计数器.常量池.直接内存.字面量.符号引用.直接引用. Java程序在运行时,需要在内存中的分配空间.为了提高运算效率,ja ...

  6. C++运行时类型信息 (RTTI)

    dynamic_cast 用于多态类型的转换 typeid typeid 运算符允许在运行时确定对象的类型 type_id 返回一个 type_info 对象的引用 如果想通过基类的指针获得派生类的数 ...

  7. JVM——内存区域:运行时数据区域详解

    关注微信公众号:CodingTechWork,一起学习进步. 引言   我们经常会被问到一个问题是Java和C++有何区别?我们除了能回答一个是面向对象.一个是面向过程编程以外,我们还会从底层内存管理 ...

  8. jvm中方法区和常量池详解_JVM——内存区域:运行时数据区域详解

    关注微信公众号:CodingTechWork,一起学习进步. 引言 我们经常会被问到一个问题是Java和C++有何区别?我们除了能回答一个是面向对象.一个是面向过程编程以外,我们还会从底层内存管理和垃 ...

  9. JVM 运行时数据区详解,写得非常好!

    作者:小小木的博客 www.cnblogs.com/wyc1994666/p/11795781.html 在接下来的几天想总结下,JVM相关的一些内容,比如下面的这三个内容算是比较核心知识点了 1.运 ...

最新文章

  1. javaSE基础知识 1.5整数类型
  2. 我的机器学习入门清单及路线!
  3. 摘之知乎网友...PHYTIN学习
  4. cordic ip核 vivado_Xilinx Vivado CORDIC IP求解atan 反正切
  5. 第四章语法分析和语法分析程序
  6. 从0开始实现自动化运维工具(一)
  7. ofo启示 | 创业企业为何大多熬不过五年?
  8. ERP原理与应用期末复习
  9. MICRO USB引脚定义以及接法
  10. keepalived 健康检查机制说明
  11. 如何在html中加入背景,html中如何加入背景图片
  12. py语言和php,php和python什么区别
  13. 每日一练||用Java图形界面实现加减乘除功能的计算器
  14. 学java难不难?java应该怎么学?
  15. 国产六大CPU厂商,近两年进展如何?
  16. 华硕主板+ubuntu18.04+3090驱动安装踩坑记录
  17. MPC多旋翼控制 - 线性MPC代码解读(mav_control_rw项目)
  18. 2020年中国智能物联网(AIoT)白皮书
  19. 提供一站式AI口语评测能力,声网AI互动课堂全新升级
  20. 安卓自定义下拉列表样式_自定义下拉列表样式

热门文章

  1. 跟着 Github 学习 Restful HTTP API 的优雅设计
  2. 对一些架构设计原则的反思
  3. 【手写系列】纯手写实现一个高可用的RPC
  4. Consul 入门指南
  5. 一起来造一个RxJava,揭秘RxJava的实现原理
  6. 荣耀鸿蒙os2.0报名入口,华为鸿蒙系统2.0在哪报名
  7. java 验证码 源码_java 验证码生成源码
  8. UPS电池异常故障案例
  9. 风口再起:数据中心建设
  10. CV之FR(H+k机器学习):基于每人几张人脸图片训练H+k模型实现(国内外明星)新人脸图像的姓名预测(准确度高达100%)