在程序中,当我们对多态类的基类指针使用typeid,就可以在运行时确定指针指向对象的实际类型,并输出对象类型的名字。

#include  < cstdlib > 
#include  < iostream > 
#include  < typeinfo > 
using   namespace  std;

class  B{
public :
     virtual   void  fun(){}
};

class  D: public  B{
public :
     void  fun(){}
};

int  main()
{
    B  * p;
    D ob;
    p =& ob;
    cout << " typeid(*p).name()= " << typeid( * p).name() << endl;
     if (typeid( * p) == typeid(D))
        cout << " typeid(*p)==typeid(D) " << endl;
    cout << " typeid(p).name()= " << typeid(p).name() << endl;
     if (typeid(p) == typeid(B * ))
        cout << " typeid(p)==typeid(B*) " << endl;
    system( " pause " );
     return   0 ;
}

这段code在VC++6.0中编译时,提示如下
warning C4541: 'typeid' used on polymorphic type 'class B' with /GR-; unpredictable behavior may result
编译后运行时错误。不知是不是此版本的VC++不符合C++标准?

在Devcpp(g++)中编译运行得到的结果是
typeid(*p).name()=1D
typeid(*p)==typeid(D)
typeid(p).name()=P1B
typeid(p)==typeid(B*)
说明用typeid作用于*p得到的的确是D类型,而用typeid作用于p得到的依然是B类的指针类型

如果typeid被作用于非多态类指针,那么我们得到的是指针被声明的类型,也就是说,此时typeid并不会返回指针所指向对象的实际类型。
如果将class B中的virtual去掉,在编译运行得到的结果是
typeid(*p).name()=1B
typeid(p).name()=P1B
typeid(p)==typeid(B*)

由此可见,在任何时刻都可以用基类指针指向派生类对象,而用typeid(*p)确定p指向的对象时,只当基类为多态类时才能真正确定p在运行时指向的实际类型。

VC默认不启动RTTI,即“运行时期类型识别”,如果在你的程序用到了RTTI,比如typeid,你必须明确告诉编译器启动RTTI,这样VC才能正确编译

选择菜单Project->settings->c/c++->category->c++ language,将Enable Run-Time Type Infomation(RTTI)选中

VC6启用运行时类型识别 (RTTI)相关推荐

  1. java 运行时类型_Java基础之RTTI 运行时类型识别

    运行时类型识别(RTTI, Run-Time Type Identification)是Java中非常有用的机制,在Java运行时,RTTI维护类的相关信息. 多态(polymorphism)是基于R ...

  2. 白话C++系列(27) -- RTTI:运行时类型识别

    http://www.cnblogs.com/kkdd-2013/p/5601783.html RTTI-运行时类型识别 RTTI:Run-Time Type Identification. 那么RT ...

  3. C++ 学习笔记之(19) new、delete表达式、RTTI(运行时类型识别)、枚举、类成员指针、嵌套类、局部类、位域、volatile、extern C

    C++ 学习笔记之(19) new.delete表达式.RTTI(运行时类型识别).枚举.类成员指针.嵌套类.局部类.位域.volatile.extern C C++ 学习笔记之(19) new.de ...

  4. RTTI机制(运行时类型识别)

    RTTI机制(运行时类型识别) 在多态里面,基类里的虚函数和派生类里的虚函数形成了遮蔽,这就导致在主程序运行时,有些表达式的类型没有办法确定.必须等到程序运行结束后,根据具体的环境才能确定.看下面的代 ...

  5. Java RTTI运行时类型识别

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

  6. MFC六大核心机制之二:运行时类型识别(RTTI)

    上一节讲的是MFC六大核心机制之一:MFC程序的初始化,本节继续讲解MFC六大核心机制之二:运行时类型识别(RTTI). typeid运算子 运行时类型识别(RTTI)即是程序执行过程中知道某个对象属 ...

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

    以下内容源于慕课网的学习整理,如有侵权,请告知删除. 1.RTTI(Run-Time Type Information),运行时类型识别. 涉及typeid.dynamic_cast这两个知识点. R ...

  8. 深入浅出MFC学习笔记:MFC六大关键技术仿真之RTTI运行时类型识别

    RTTI(运行时类型识别) 参考文献:深入浅出MFC-侯捷 怎样去构造类别型录网? 一.定义数据结构: 其中pFirstClass指针属于痊愈变量,所以它应该以static修饰之. 而且我们最终希望达 ...

  9. C++11 的 运行时类型识别type_info

    一.type_info与typeid 类type_info保存关于类型的特定于实现的信息,包括类型的名称,以及比较两个类型是否相等或排序顺序的方法. 这是typeid操作符返回的类.具有如下特点: ( ...

最新文章

  1. 优化物理和机器学习之间的协同作用
  2. HTML 資訊汲取(中篇) - Default namespace 問題
  3. linux中fork()函数与vfork()函数的区别
  4. 神秘大三角(判断点与三角形的关系)
  5. python getchar_system(“pause”)和getchar()
  6. Android Fragment 生命周期及其正确使用(建议使用自定义View替换Fragment)
  7. ubuntu系统安装socket服务器,Ubuntu上进行socket编程,并且实现通信功能
  8. 源码里没有configure_深入源码理解.NET Core中Startup的注册及运行
  9. MTK A/B system说明及配置
  10. 《大道至简——软件工程实践者的思想》阅读笔记之一
  11. mysql 大小写问题—20161102
  12. webapi 给自己挖的坑
  13. 2016--MatConvNet Convolutional Neural Networks for MATLAB
  14. java中while的用法案例_Java While循环 do-while循环用法
  15. wps文档忘记保存关闭了怎么恢复
  16. 统计指标 --- 集中趋势
  17. 树莓派2使用360wifi ,小米wifi
  18. MATLAB 代码资料大全
  19. Connect to maven.google.com:443 [maven.google.com] failed: Connection timed out: connect 解决办法
  20. 根据正则规则爬取一个网站的视频

热门文章

  1. 食品安全--牛奶和蛋白质浅谈
  2. 重学TCP协议(5) 自连接
  3. leetcode 714. 买卖股票的最佳时机含手续费(dp)
  4. typescript_清洁架构的TypeScript刺
  5. node seneca_使用Node.js和Seneca编写国际象棋微服务,第2部分
  6. 为什么用scrum_为什么Scrum糟糕于数据科学
  7. 接口测试(java+testng+ant+jenkins)第三篇ant
  8. 使用winform来递归实现资源管理器
  9. 弱水三千 之 统计独立性、统计相关性辨析
  10. 【ExtJS】FormPanel 布局(一)