前言
C语言的类型转换比较自由,但也带来了一些问题,这些问题大多由程序员自行控制和解决。对于庞大的C++语言机制而言,这种简单粗暴的类型转换方式显然是个巨大的负担,因此C++引入4种类型转换运算符,更加严格的限制允许的类型转换,使转换过程更加规范:
dynamic_cast 用于多态类型的转换
static_cast 用于非多态类型的转换
const_cast 用于删除const ,volatile 和 __unaligned 属性
reinterpret_cast 用于位的简单重新解释
其中,const_cast和reinterpret_cast的使用会带来更大的风险,因此不到万不得已,不推荐使用。
dynamic_cast
//将expression转换为type类型.
dynamic_cast<type>(expression);
注:
1、转换类型必须是一个指针、引用或者void*,用于将基类的指针或者引用安全地转换成派生类的指针或引用;
2、dynamic_cast在运行期间强制转换,运行时进行类型检查;
3、不能用于内置类型转换;
4、用于类型转换,基类中一定要有虚函数(保证多态),不然会编译错误。(类中存在虚函数,就说明它有想要让基类指针或引用指向派生类对象的情况,此时转换才有意义。由于运行时类型检查需要运行时类型信息,而这个信息存储在类的虚函数表中,只有定义了虚函数的类才有虚函数表)
5、对指针进行dynamic_cast,失败返回null,成功返回正常cast后的对象指针;对引用进行dynamic_cast,失败抛出一个异常,成功返回正常cast后的对象引用。
#include<iostream>
using namespace std;
// 基类
class Base {
public:
virtual void show() {
cout << "void Base::show();" << endl;
};
virtual ~Base() {
};
};
//派生类
class Derived :public Base {
public:
void show() {
cout << "void Derived::show();" << endl;
};
};
int main() {
Base* base = new Derived