r e i n t e r p r e t _ c a s t {\red{reinterpret\_cast}} reinterpret_cast
对二进制数据进行重新解释
char *a = new char;
*a = 'a';
cout<<*a<<endl;
printf("%0x\n",a);
int *b = reinterpret_cast<int*>(a);
cout<<*b<<endl;
printf("%0x\n",b);
输 出 : {\orange{输出:}} 输出: a 地址 97 地址
两 个 地 址 相 同 , 只 是 对 二 进 制 数 据 进 行 新 的 解 释 {\green{两个地址相同,只是对二进制数据进行新的解释}} 两个地址相同,只是对二进制数据进行新的解释
因 为 类 型 长 度 不 一 样 , 很 危 险 {\green{因为类型长度不一样,很危险}} 因为类型长度不一样,很危险
c o n s t _ c a s t {\red{const\_cast}} const_cast
解除const,必须为指针或引用
struct A{
int v;
A():v(0){}
};
int main(){
// struct
const A a;
A* p1 = const_cast<A*>(&a); // 指针
p1->v = 1;
cout<<a.v<<endl;
A& p2 = const_cast<A&>(a); // 引用
p2.v = 2;
cout<<a.v<<endl;
const int b = 0;
// int
int* q1 = const_cast<int*>(&b); // 指针
*q1 = 1;
cout<<b<<endl;
int& q2 = const_cast<int&>(b); // 引用
q2 = 2;
cout<<b<<endl;
return 0;
}
输 出 : 1 2 0 0 {\orange{输出:1\ 2\ 0\ 0}} 输出:1 2 0 0
结 构 体 可 以 , 整 型 不 可 以 {\green{结构体可以,整型不可以}} 结构体可以,整型不可以
d y n a m i c _ c a s t {\red{dynamic\_cast}} dynamic_cast 和 s t a t i c _ c a s t {\red{static\_cast}} static_cast
dynamic_cast:向下安全转型,继承链必须有虚函数,RTTI通过虚表实现
static_cast:数据类型转型,最常见的类型转换,有可能不安全。
主要用于继承体系,由 指 向 派 生 类 的 基 类 指 针 {\red{指向派生类的基类指针}} 指向派生类的基类指针转为 派 生 类 指 针 {\red{派生类指针}} 派生类指针或 兄 弟 类 指 针 {\red{兄弟类指针}} 兄弟类指针
class A1{
public:
virtual void printA1(int x=1){cout<<"A1 "<<x<<endl;}
};
class A2{
public:
virtual void printA2(int x=2){cout<<"A2 "<<x<<endl;}
};
class B:public A1,public A2{
public:
virtual void printA1(int x=10){cout<<"B:A1 "<<x<<endl;}
virtual void printA2(int x=20){cout<<"B:A2 "<<x<<endl;}
};
int main(){
A1 *a1 = new B;
//p->printA2(); //error
B *b = dynamic_cast<B*>(a1); // 派生类
b->printA2();
A2 *a2 = dynamic_cast<A2*>(a1); // 兄弟类
a2->printA2();
B *bs = static_cast<B*>(a1);
// A2 *a2d = static_cast<A2*>(a1); //error
return 0;
}
输 出 : {\orange{输出:}} 输出: B:A2 20 B:A2 2
d y n a m i c _ c a s t 可 以 将 基 类 指 针 转 为 派 生 类 , 转 为 基 类 的 兄 弟 类 。 {\green{dynamic\_cast可以将基类指针转为派生类,转为基类的兄弟类。}} dynamic_cast可以将基类指针转为派生类,转为基类的兄弟类。
s t a t i c _ c a s t 可 以 将 基 类 指 针 转 为 派 生 类 {\green{static\_cast可以将基类指针转为派生类}} static_cast可以将基类指针转为派生类