RTTI-运行阶段类型识别及类型转换

1.dynamic_cast

dynamic_cast< type-name > (expression)
能够在类层次结构中进行向上转换(由于is-a关系,这样的类型转换是安全的),而不允许其他转换。主要用途是确保可以安全地调用虚函数。
假设有下述三个类:
class Grand{//has virtual methods};
class Superb:pubic Grand{...};
class Magnificent:public Superb{...};
指针
Grand *pg = new Grand;
Grand *ps = new Superb;
Grand *pm = new Magnificent;
最后,对于下面的类型转换;
Magnificent* p1 = (Magnificent*) pm; //#1
Magnificent* p2 = (Magnificent*) pg; //#2
Superb* p3=(Magnificent*) pm;	//#3
#1 安全;pm原本即为Magnificent类
#2 不安全;基类不能赋给派生类
#3 安全;派生类可赋给基类

注意: 通常,如果指向的对象(*pt)的类型为Type或者是从Type直接或间接派生而来的类型,则下面的表达式将指针pt转换为Type类型的指针:
dynamic_cast<Type*>(pt)
否则,结果为0,即为空指针;

2.typeid/type_info

如果pg指向的是一个Magnificent对象,则下述表达式的结果为bool值true,否则为false;
typeid(Magnificent)==typeid(*pg)
type_info类的实现随厂商而异,但包含一个name()成员,该函数返回一个随实现而异的字符串:通常(但并非一定)是类的名称。
cout<<"Now processing type "<<typeid(*pg).name()<<".\n";

3.const_cast

只执行一种用途的类型转换,即改变值为const或volatile
const_cast<type-name>(expression)
除了const或volatile特征(有或无)可以不同外,type_name和expression的类型必须相同。假设High和Low是两个类:
High bar;
const High* cbar=&bar;
...
High* pb=const_cat<High*>(cpbr);		//valid
const Low* pl=const_cast<const Low*>(cbar)	//valid
第一个类型转换使得*pb 成为一个可用于修改bar对象值的指针,它删除const标签。第二个类型转换是非法的,因为它同时尝试将类型从const High* 改为const Low*。
提供该运算符的原因是,有时候可能需要这样一个值,他在大多数时候是常量,而有时又是可以修改的。在这种情况下,可以将这个值声明为const,并在需要修改它的时候,使用const_cast。通用转换也可以实现:
High bar;
const High* cbar=&bar;
...
High* pb=(High*)(cpbr);		//valid
Low* pl=(Low*)(cbar)		//also valid
由于编程时可能无意间同时改变类型和常量特征,因此使用const_cast运算符更安全。


4.static_cast

static_cast<type-name>(expression)
仅当type_name可被隐式转换为expression所属的类型或expression可被隐式转换为type_name所属的类型时,上述转换才是合法的,否则将出错。假设High是Low的基类,而Pond是一个无关的类,则从High到Low的转换、从Low到High的转换都是合法的,而从Low到
Pond的转换是不允许的:
High bar;
Low blow;
...
High* pb = static_cast<High*>(&blow);		//valid upcast
Low* pl = static_cast<Low*>(&bar);		//valid downcast
Pond* pmer = static_cast<Pond*>(&blow);		//invalid,Pond unrelated
第一种转换是合法的,因为向上转换可以显示地进行。第二种转换是从基类指针到派生类指针,在不进行显式类型转换的情况下,将无法进行。
可以用static_cast将整型转换为枚举值。同样可以用static_cast将double转换为int,将float转换为long以及其他各种数值转换。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值