1、static_cast(隐式类型转换)—–>相关类型的转换
static_cast用于非多态类型的转换(静态转换),任何标准转换都可以用它,但
它不能用于两个不相关的类型进行转换。
2、reinterpret_cast(强制类型转换)
reinterpret_cast操作符用于将一种类型转换为另一种不同的类型。
3.const_cast(去const属性的类型转换)
const_cast最常用的用途就是删除变量的const属性,方便赋值。
4、dynamic_cast(动态类型转换)——->适用于多态
dynamic_cast用于将一个父类对象的指针转换为子类对象的指针或引用(动态转换)
向上转型:子类对象指针->父类指针/引用(不需要转换)
向下转型:父类对象指针->子类指针/引用(用dynamic_cast转型是安全的)
重点:转换需要满足以下条件:
1. dynamic_cast只能用于含有虚函数的类
2. dynamic_cast会先检查是否能转换成功,能成功则转换,不能则返回0
示例:
#define _CRT_SECURE_NO_WARNINGS 1
#include<iostream>
using namespace std;
struct A
{
A(int a)
:_a(a)
{}
virtual void fun()
{}
int _a;
};
struct B :public A
{
B(int a, int b)
:_b(b)
, A(a)
{}
int _b;
};
void Fun(A* pa)
{
//如何判断pa绑定的对象是父类对象还是子类对象
B* pb1 = dynamic_cast<B*> (pa);//动态转换
B* pb2 = reinterpret_cast<B*> (pa);//强制类型转换
cout << pb1 << endl;
cout << pb2 << endl;
}
void Test()
{
A a1(1);//构造函数
//应该为:先调构造函数使用4构造一个A类的对象,再使用这个临时对象拷贝构造一个A类的对象a2.
//可以使用下面方式来构造一个A类类型的对象的条件是:
//①构造函数必须是单参的;
//②构造函数不能使用explict修饰,explict关键字防止隐式类型转换
A a2 = 4; //(隐式类型转换)编译器对这个表达式做了优化,即就是只调了A类的构造函数。
B bb(2,3);
Fun(&a1);//绑定父类对象
Fun(&bb);//绑定子类对象
}
int main()
{
Test();
return 0;
}
结果如下:
从上述结果可得:
当将绑定父类对象的指针转换(强转或者动态转换)为子类的指针时,动态转换的子类指针结果为空(0)。
而将绑定子类对象的指针转换(强转或动态转换)为子类的指针时,动态转换的子类指针和强制类型转换的结果相等且不为0。