dynamic_cast class Base { int _i; virtual void foo() {};//基类必须有虚函数。保持多态特性才能使用dynamic_cast }; class Sub : public Base { public: char* _name[100]; void Bar() {}; }; int doSomething() { return 0; } int main() { /* const_cast */ struct T { int i; }const a; //a.i = 0; T& b = const_cast<T&>(a); /* static_cast */ int n = 6; double d = static_cast<double>(n);//基本类型转换 int* pn = &n; //double* d = static_cast<double*>(&n);//无关类型转换 void* p = static_cast<void*>(pn);//将任意指针转换为void*类型 /* dynamic_cast */ //有条件转换,动态类型转换、 //1) 安全的基类和子类之间的转换 //2) 必须有虚函数 //3) 相同基类不同子类之间的交叉转换,但结果返回NULL Base* pb = new Sub(); Sub* ps1 = static_cast<Sub*>(pb);//不推荐 Sub* ps2 = dynamic_cast<Sub*>(pb); delete pb; pb = ps1 = ps2 = nullptr; Base* pb2 = new Base(); Sub* ps21 = static_cast<Sub*>(pb2);//访问子类_name成员越界 Sub* ps22 = dynamic_cast<Sub*>(pb2);//返回结果为NULL delete pb2; pb2 = nullptr; ps21 = ps22 = nullptr; /* reinterpret_cast */ //仅重新解释类型,但没有进行二进制的转换: //1) 转换的类型必须是一个指针、应用、算数类型、函数指针或者成员指针 //2) 在比特级别上进行转换,可以把一个指针转换成一个整数,也可以把一个整数 //转换成一个指针,(先把一个指针转换成一个整数,再把该整数转换成原类型的指针, //还可以得到原先的指针值)。但不能将非32bit的实例转成指针 //3) 最普通的用途就是在函数指针类型之间进行转换。 //4) 很难保证移植性 using FuncPtr = void(*)();//指向函数的指针,函数没有参数,返回类型为void FuncPtr funcPtrArray[10]; //funcPtrArray[0] = &doSomething;//类型不匹配 funcPtrArray[0] = reinterpret_cast<FuncPtr>(&doSomething);//不同函数指针类型之间进行转换 return 0; }