#include <iostream>
using namespace std;
//c++类型转换
//static_cast,dynamic_cast,reinterpret_cast,const_cast
static_cast
// static_cast用于内置数据类型间的转换
//static_cast无法进行不同指针类型的转换
reinterpret_cast
//1)reinterpret cast 的第一种用途是改变指针(引用)的类型。
// 2) reinterpret cast的第二种用途是将指针(引用)转换成整型变量。
//整型与指针占用的字节数必须一致,否则会出现警告,转换可能损失精度。
//3)reinterpret cast的第三种用途是将一个整型变量转换成指针(引用)
const_cast
//const_cast 把const属性去除/添加
dynamic_cast
//dynamic_cast
// dynamic cast 运算符用指向基类的指针来生成派生类的指针,它不能回答“指针指向的是什么类的对象”的问题,但能回答“是否可以安全的将对象的地址赋给特定类型的指针”的问题。“
// 1) dynamic cast 只适用于包含虚函数的类。
//2)dynamic cast 可以将派生类指针转换为基类指针,这种画添足的做法没有意义。“
//3)dynamic cast 可以用于引用,但是,没有与空指针对应的引用值,如果转换请求不正确,会出现 bad cast异常。“
class A {
public:
virtual void a2() {
cout << "a的虚函数\n";
}
};
class B :public A {
public:
void a2() override {
cout << "b的虚函数\n";
}
void Do1() {
cout << "是b类型\n";
}
};
class C :public A {
public:
void a2() override {
cout << "c的虚函数\n";
}
};
auto staticcast(void* ptr) {
double* a = static_cast<double*> (ptr);
return a;
}
void reintercast(void* ptr) {
int a = reinterpret_cast<int> (ptr);//把指针类型转换为整型
cout << "a:" << a << endl;
}
void constcast(int* ii) {
}
int main()
{
#pragma region static_cast
int a = 1;
double d = 1.2;
int i = (int)d;//c风格的显示转换
int j = int(d);//c风格的显示转换
int k = static_cast<int>(d);//C++的显示转换
int* qq = (int*)&d;//c风格的强转
double* ww = (double*)&a;//c风格的强转
int b = 3;
//double* www = static_cast<double*>(&b);//static_cast无法直接进行不同指针类型的转换,只能先转换为void*再转换(相当于中转站)
void* ptr = &b;//任何类型的指针都可以隐式转换为void*
staticcast(ptr);
#pragma endregion
#pragma region reinterpret_cast
int abc = 10;
reintercast(reinterpret_cast<void*>(abc));//整型变量转换成指针
// double* wwww = reinterpret_cast<double*>(&a);//不安全,因为reinterpret_cast会跳过编译器的类型检查,导致出现未定义的后果
#pragma endregion
#pragma region const_cast
const int* xq = nullptr;
int* xw = (int*)xq;//c风格强转
int* xe = const_cast<int*>(xq);//去除了const
int* az = nullptr;
const int* ax = const_cast<const int*>(az);//获得了const
const int* l = nullptr;
constcast(const_cast<int*>(l));//去除const传入函数
#pragma endregion
#pragma region dynameic_cast
A* a4 = new B();
A* c4 = new C();
if (c4 == dynamic_cast<B*>(a4))//不相等,类型不同
{
B* bb = dynamic_cast<B*>(a4);
bb->Do1();
}
B* df = dynamic_cast<B*>(a4);//检查a4是不是B类,如果不是,df为空指针
if (df!=nullptr)
{
df->Do1();
}
#pragma endregion
return 0;
}