RTTI(RunTime Type Information)执行时类型信息 具体解释

本文地址: http://blog.csdn.net/caroline_wendy/article/details/24369987

RTTI, RunTime Type Information, 执行时类型信息, 是多态的主要组成部分,

通过执行时(runtime)确定使用的类型, 执行不同的函数,复用(reuse)接口.

dynamic_cast<>能够 使基类指针转换为派生类的指针, 通过推断指针的类型, 能够决定使用的函数.

typeid(), 能够推断类型信息, 推断指针指向位置, 在多态中, 能够推断基类还是派生类.

代码:

  1. /*
  2. * test.cpp
  3. *
  4. * Created on: 2014.04.22
  5. * Author: Spike
  6. */
  7.  
  8. /*eclipse cdt, gcc 4.8.1*/
  9.  
  10. #include <iostream>
  11. #include <typeinfo>
  12.  
  13. using namespace std;
  14.  
  15. class Base {
  16. public:
  17. virtual void fcnA() {
  18. std::cout << "base" << std::endl;
  19. }
  20. };
  21.  
  22. class Derived : public Base {
  23. public:
  24. virtual void fcnB() {
  25. std::cout << "derived" << std::endl;
  26. }
  27. };
  28.  
  29. void fcnC(Base* p) {
  30. Derived* dp = dynamic_cast<Derived*>(p);
  31. if (dp != NULL)
  32. dp->fcnB();
  33. else
  34. p->fcnA();
  35. }
  36.  
  37. void fcnD(Base* p) {
  38. if (typeid(*p) == typeid(Derived)) {
  39. Derived* dp = dynamic_cast<Derived*>(p);
  40. dp->fcnB();
  41. } else
  42. p->fcnA();
  43. }
  44.  
  45. int main(void) {
  46. Base* cp = new Derived;
  47. std::cout << typeid(cp).name() << std::endl;
  48. std::cout << typeid(*cp).name() << std::endl;
  49. std::cout << typeid(&(*cp)).name() << std::endl;
  50. fcnC(cp);
  51. fcnD(cp);
  52. Base* dp = new Base;
  53. fcnC(dp);
  54. fcnD(dp);
  55.  
  56. return 0;
  57. }

输出:

  1. P4Base
  2. 7Derived
  3. P4Base
  4. derived
  5. derived
  6. base
  7. base

以上代码仅仅是演示样例,

详细使用时, 避免使用dynamic_cast<>和typeid()去推断类型, 直接通过多态就可以.

注意多态的绑定仅仅能通过指针, 如fcnC(Base*), 或引用, 如fcnD(Base&), 实现动态绑定,
两者效果同样;

都会依据输入的类型,动态绑定虚函数(virtual function).

代码例如以下:

  1. /*
  2. * test.cpp
  3. *
  4. * Created on: 2014.04.22
  5. * Author: Spike
  6. */
  7.  
  8. /*eclipse cdt, gcc 4.8.1*/
  9.  
  10. #include <iostream>
  11. #include <typeinfo>
  12.  
  13. using namespace std;
  14.  
  15. class Base {
  16. public:
  17. virtual void fcn() {
  18. std::cout << "base" << std::endl;
  19. }
  20. };
  21.  
  22. class Derived : public Base {
  23. public:
  24. virtual void fcn() override {
  25. std::cout << "derived" << std::endl;
  26. }
  27. };
  28.  
  29. void fcnC(Base* p) {
  30. p->fcn();
  31. }
  32.  
  33. void fcnD(Base& p) {
  34. p.fcn();
  35. }
  36.  
  37. int main(void) {
  38. Base* cp = new Derived;
  39. std::cout << typeid(cp).name() << std::endl;
  40. std::cout << typeid(*cp).name() << std::endl;
  41. fcnC(cp);
  42. fcnD(*cp);
  43. Base* dp = new Base;
  44. fcnC(dp);
  45. fcnD(*dp);
  46.  
  47. Base& cr = *cp;
  48. std::cout << typeid(&cr).name() << std::endl;
  49. std::cout << typeid(cr).name() << std::endl;
  50. fcnC(&cr);
  51. fcnD(cr);
  52. Base& dr = *dp;
  53. fcnC(&dr);
  54. fcnD(dr);
  55.  
  56. return 0;
  57. }

输出:

  1. P4Base
  2. 7Derived
  3. derived
  4. derived
  5. base
  6. base
  7. P4Base
  8. 7Derived
  9. derived
  10. derived
  11. base
  12. base

C++ - RTTI(RunTime Type Information)执行时类型信息 具体解释的更多相关文章

  1. RTTI (Run-time type information) in C++

    In C++, RTTI (Run-time type information) is available only for the classes which have at least one v ...

  2. c++对象模型和RTTI(runtime type information)

    在前面已经探讨过了虚继承对类的大小的影响,这次来加上虚函数和虚继承对类的大小的影响. 先来回顾一下之前例子的代码: #include <iostream> using namespace ...

  3. RTTI(Runtime Type Information )

    RTTI 是“Runtime Type Information”的缩写,意思是:运行时类型信息.它提供了运行时确定对象类型的方法.本文将简略介绍 RTTI 的一些背景知识.描述 RTTI 的概念,并通 ...

  4. c++ RTTI(runtime type info)

    RTTI(Run-Time Type Information,通过运行时类型信息)程序能够使用基类的指针或引用来检查这些指针或引用所指的对象的实际派生类型. RTTI提供了以下两个非常有用的操作符: ...

  5. Dynamic type checking and runtime type information

    动态类型的关键是将动态对象与实际类型信息绑定. See also: Dynamic programming language and Interpreted language Dynamic type ...

  6. 【JavaSE】运行时类型信息(RTTI、反射)

    运行时类型信息使得你可以在程序运行时发现和使用类型信息.--<Think in java 4th> **** 通常我们在面向对象的程序设计中我们经常使用多态特性使得大部分代码尽可能地少了解 ...

  7. 是否含有RTTI(运行时类型信息)是动态语言与静态语言的主要区别

    运行时类型信息代表类型信息和对内存的操作能力. 运行时类型信息是运行时系统的基础. 类型信息分为编译时类型信息和运行时类型信息两种: 静态语言的类型信息只在编译时使用和保留,在可执行文件中没有类型信息 ...

  8. 了解运行时类型信息(RTTI)

    RTTI需要引用单元TypeInfo GetPropInfo 函数用于获得属性的 RTTI 指针 PPropInfo.它有四种重载形式,后面三种重载的实现都是调用第一种形式.AKinds 参数用于限制 ...

  9. RTTI (Run-Time Type Identification,通过运行时类型识别) 转

    参考一: RTTI(Run-Time Type Identification,通过运行时类型识别)程序能够使用基类的指针或引用来检查这些指针或引用所指的对象的实际派生类型.   RTTI提供了以下两个 ...

随机推荐

  1. redis新特性

    摘自<redis 4.xcookbook> 从实例重启同步] 故障切换同步] 4.0之前从实例主键过期bug redis4新特性 Memory Command Lazy Free PSYN ...

  2. gifsicle for linux ----------gif 图像处理

    1.gifsicle 在linux 中的使用下载gifsicle yum install gifsicle 若发现没有此包 ,更新epel第三方软件库 sudo yum install epel-re ...

  3. jQuery-图片的放大镜显示效果方法封装

    (function($){ $.fn.jqueryzoom = function(options){ var settings = { xzoom: 200, //zoomed width defau ...

  4. 解决mysql时区问题以及SSL问题

    看了下网上的教程,觉得都太麻烦啦,这里推荐个简单的! 解决时区问题 只需要加上serverTimezone=UTC即可,如下: spring.datasource.url=jdbc:mysql://1 ...

  5. [Python3网络爬虫开发实战] 7.3-Splash负载均衡配置

    用Splash做页面抓取时,如果爬取的量非常大,任务非常多,用一个Splash服务来处理的话,未免压力太大了,此时可以考虑搭建一个负载均衡器来把压力分散到各个服务器上.这相当于多台机器多个服务共同参与 ...

  6. centos6 用户登陆管理

    查看当前登陆有哪些用户,在做什么 [root@web01 ~]# w :: up :, users, load average: 0.00, 0.00, 0.00 USER TTY FROM LOGI ...

  7. 通过更改scrapy源码进行spider分发实现一个综合爬虫

    最近我正写一个项目,项目的需求如下一,要爬取大约100种几百个网页的类容,并且这些网页的爬取频率不一样,有些一天爬取一次,有些一周爬取一次,二,网页爬取内容有变化,也就是说要爬取的内容会根据需求进行改 ...

  8. Vue如何使用vee-validate表单验证

    Vue项目遇到要表单验证了吧,对我来说表单验证是个很纠(dan)结(teng)的内容,各种判断凌乱到飞起.往常使用jquery的validate插件做表单验证方便吧,你也可以在Vue里引入jquery ...

  9. jz2440开发板烧写裸板

    前提:手头没有openjtag,电脑上没有并口, 实现方法:jlink下载,nor上的uboot下载 关键点是用jlink下载uboot 1,使用jlink进行烧写,其中注意的是jlink只能烧写no ...

  10. 51中xdata,idata,data,pdata的区别

    51系列中data,idata,xdata,pdata的区别 data: 固定指前面0x00-0x7f的128个RAM,可以用acc直接读写的,速度最快,生成的代码也最小. idata: 固定指前面0 ...