前言
C语言的类型转换比较自由,但也带来了一些问题,这些问题大多由程序员自行控制和解决。对于庞大的C++语言机制而言,这种简单粗暴的类型转换方式显然是个巨大的负担,因此C++引入4种类型转换运算符,更加严格的限制允许的类型转换,使转换过程更加规范:
dynamic_cast
用于多态类型的转换-
static_cast
用于非多态类型的转换 -
const_cast
用于删除const
,volatile
和__unaligned
属性 reinterpret_cast
用于位的简单重新解释
其中,const_cast
和reinterpret_cast
的使用会带来更大的风险,因此不到万不得已,不推荐使用。
dynamic_cast
dynamic_cast<type>(expression);
作用: 将expression转换为type类型.
备注:
① 转换类型必须是一个指针、引用或者void*,用于将基类的指针或引用安全地转换成派生类的指针或引用;
② dynamic_cast在运行期间强制转换,运行时进行类型转换检查;
③ 对指针进行转换,失败返回null,成功返回type类型的对象指针,对于引用的转换,失败抛出一个bad_cast
,成功返回type类型的引用;
④ dynamic_cast不能用于内置类型的转换;
⑤ 用于类的转换,基类中一定要有virtual定义的虚函数(保证多态性),不然会编译错误。
没有多态性的基类无法进行dynamic_cast强制转换
举个例子:
dynamic_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() {