1. dynameic_cast
假设High和Low是两个类,而ph和pl的类型分别为High *和Low *,则仅当Lows是High的可访问基类(直接或间接)时,语句:
pl = dynameic_cast<Low *>ph;
才将一个Low *指针赋给pl;否则,该语句将空指针赋给pl。通常,该操作符的句法如下:
dynameic_cast<type-name> (expression)
该操作符使得能够在类层次结构中进行向上转换(由于is-a关系,这样的类型转换是安全的),而不允许其他转换。
关于该操作符的更多介绍请查看<<RTTI运行时类型识别>>。
2. const_cast
该操作符用于执行只有一种用途的类型转换,即改变值为const或volatile,其句法如下:
const_cast<type-name> (expression)
如果类型的其他方面也被修改,则上述类型转换将出错。也就是说,除了const或volatile特征(有或无)可以不同外,type-name和expression的类型必须相同。
假设High和Low是两个类:
High bar;
const High * pbar = &bar;
...
High * pb = const_cast<High *> (pbar); // valid
const Low * pl = const_cast<const Low *> (pbar); // invalid
第一个类型转换使得*pb成为一个可用于修改bar对象值的指针,它删除const标签。
第二个类型转换是非法的,因为它同时尝试将类型从const High *改为const Low * 。
const_cast可以修改指向一个值的指针,但修改const值的结果是不确定的。编译器可能禁止对const的修改,从而创建一个临时拷贝。
3. static_cast
static_cast<type-name> (expression)
仅当type-name可被隐式转换为expression所属的类型或expression可被隐式转换为type-name所属的类型时,上述转换才是合法的。
假设High是Low的基类,而Pond是个无关的类,则从Hinh到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以及其他各种数值转换。
4. reinterpret_cast
reinterpret_cast <type-name> (expression)
该操作符用于一些危险的类型转换。它不允许删除const。例:
struct dat {short a; short b};
long value = 0xA224B118;
dat * pd = reinterpret_cast<dat *> (&value);
cout << pd->a; // display first 2 bytes of value
reinterpret_cast操作符并不支持所有的类型转换。例如,可以将指针类型转换为足以存储指针表示的整型,但不能将指针转换为更小的整型或浮点型。另外,不能将函数指针转换为数据指针,反之亦然。