显示转换也叫做强制类型转换,包括下面四个:
1)static_cast
2)dynamic_cast
3)const_cast
4)reinterpret_cast
1)static_cast
编译器隐式执行的任何类型转换都可以有static_cast显示完成。
2)dynamic_cast
dynamic_cast支持运行时识别指针或引用所指向的对象,可以使用dynamic_cast操作符将基类类型对象的引用或者指针转换为同一继承层次中其他类型的引用或者指针。要注意的是,dynamic_cast需要在程序运行时执行检查,需要执行两个操作。首先需要检查被请求的转换是否有效,如果绑定到指针或者引用的对象不是目标类型的对象,则转换失败,结果为0,返回0,同时抛出异常(bad_cast)。如检查验证成功,那么就会执行实际转换,转换成功,返回目标转换类型,否则返回0,抛出异常bad_cast。
#include <iostream> using namespace std; class Base { public: Base() { cout << "Base对象创建!\n"; } virtual ~Base() { cout << "Base对象删除!\n"; } void Print() { cout << "我是Base的Print\n"; } }; class Derived1:public Base { public: Derived1() { cout << "Derived1对象创建!\n"; } virtual ~Derived1() { cout << "Derived1对象删除!\n"; } virtual void Print() { cout << "我是Derived1的Print\n"; } }; class Derived2:public Base { public: Derived2() { cout << "Derived2对象创建!\n"; } virtual ~Derived2() { cout << "Derived2对象删除!\n"; } virtual void Print() { cout << "我是Derived2的Print\n"; } }; int main(int argc, char *argv[]) { Base *basePtr = new Derived1(); //Base *basePtr = new Derived2(); //Base *basePtr = new Base(); //对象是Base和Derived1都会导致dynamic_cast转换失败 //只有basePtr指向的是Derived1对象时才会成功 if( Derived1 *p = dynamic_cast<Derived1 *>(basePtr) ) { p->Print(); } else { cout << "转换失败!\n"; } return 0; }
Derived1 *p = basePtr;
显然是编译不通过的,但是通过dynamic_cast的转换,就允许了,但是这个允许的条件是basePtr必须是指向Derived1的对象的指针。
3)const_cast
顾名思义,const_cast会把表达式的const性质移除。只有合法使用const_cast才能将表达式的const性质转换掉,任何通过其他三种形式的强制转换都会导致编译时出错,类似的,除了添加和删除const特性,试图使用const_cast来执行其他类型转换的时候也都会告之以失败。
4)reinterpret_cast(本质上依赖于机器)
reinterpret_cast提供了对较低层次的操作数的位模式的重新解释。
总结:static_cast可以完成编译器的任何隐式转换,const_cast将目标的const特性转换掉,dynamic_cast则是返璞归真。
警告:强制类型转换,少用慎用,一生受用
以上内容来自读<<C++primer>>所得。