@cxm-2016
2016-09-10T11:11:48.000000Z
字数 972
阅读 1620
c++
no
作者:陈小默
RIIT是运行时类型识别(Runtime Type Identification)的简称。这是新添加到C++中的特性,因此各个厂商的机制通常不兼容——
作为一个Java出身的程序猿我就想问C++存在的意义是什么?专门恶心程序猿的么?
——因此其实现与厂商心情有关。
RIIT的目的是个指针类型转换提供一个安全机制,其中最主要的关键字(迟早牛津词典随便翻一页都是C++的关键字
)
注意:RIIT只能适用于包含虚函数的类
当我们将一个指针赋值给同类型的指针变量,这种转换方式是可行并且安全的。我们把一个指向派生类的指针赋值给基类指针变量,这种转换方式同样是可行并且安全的。但是假如我们要把指向基类的指针赋值给派生类指针变量,这种转换方式虽然可行,但是并不安全。因此,为了处理安全问题,C++标准委员会(一个并没有什么卵用的组织
)提供了dynamic_cast关键字。
其语法规则如下:
Type * p = dynamic_cast<Type *>(pt);
如果类型安全,我们将得到一个Type类型的指针p,否则结果为0(NULL,nullptr,false)C++的尿性
所以在程序中通常的做法是
Type *pt;
if(p = dynamic_cast<Base *>(pb))
pt->show();
注意:即使编译器支持RIIT,在默认情况下可能并未开启,所以可能会导致编译成功运行失败(
所以说C++标准委员会是一个并没有什么卵用的组织,跟联合国一样
)
typeid运算符能确定两个对象是否为相同的类型,其可以接受两种参数
常用如下形式判断对象是否属于某一个类
if(typeid(Base) == typeid(*pb))
pb.show();
当传入的对象为null时抛出bad_typeid异常
type_info类的实现随厂商而异,但包含一个name()成员,该函数通常返回类名。
cout<<typeid(*pg).name()<<endl;