RTTI的3个支持元素:
①强制类型转换:
1>dynamic_cast:在类层次结构中执行指针和引用的向上转换:
dynamic_cast<type>(expression) //expression→type
具体地说:dynamic_cast用于在类的派生层次结构中执行向上转换(派生类→基类);
dynamic_cast只用于指针(*)和引用(&),而不用于普通类型;
dynamic_cast执行运行期间类型检查,若可以进行向上转换,返回转换结果;若不可以,当其执行指针转换则返回NULL,当其执行引用转换则抛出bad_cast异常。
2>static_cast:用于普通类型间的强制转换:
static_cast<type>(expression) //expression→type
具体地说:static_cast用于普通类型之间的强制转换;
static_cast可用于所有类型;
static_cast不执行运行期间类型检查,因此带来的结果不一定安全。
3>const_cast:用于除去变量的const标签:
const_cast<type>(expression) //expression→type
具体地说:const_cast用于同类型间的强制转换;
const_cast可用于所有类型;
const_cast除去变量的const标签,使得变量可以被修改。
<font color= #32CD32>//值得注意的是,const_cast虽然除去指向变量的const标签,但不改变指针的const标签:
int a = 1;
const int* const c = &a; //不可修改指向性,并没有修改a的权限的指针c
int* const p = const_cast<int*>(a); //不可修改指向性,但有修改a的权限的指针c
并且当指向物本身为const时,const_cast无法通过指针除去变量本身的const:
int a = 1;
const int* c = &a;
int* p = const_cast<int*>(c); //可以除去const,p可以修改a的值
const int a = 1;
const int* c = &a;
int* p = const_cast<int*>(c); //可以除去const,但p不可以修改a的值,因为a本身为const
const_cast可以改变指针的访问权限,不可以改变指向物本身的属性,不可以修改指针的指向性是否可变。
②类型判断:
typeid(classname) //返回一个type_info对象
其中type_info类包含于<typeinfo>头文件中;
type_info类包含类方法.name(),返回类名称;
type_info类重载了比较运算符(==,!=)因此可以用作判断是否为同类:
typeid(classname1) == typeid(classname2)
③类型的有关信息:类型的有关信息被储存在type_info类中。
//虽然RTTI也可以用于判断类型以选择使用哪一个(同名)方法,但它绝不应该取代virtual虚函数。