隐式类型转换:内置类型等直接转换安全的,可以直接隐式类型转换。
不同类型的指针,不能隐式类型转换。(除了向上类型转换)
强制类型转换:B b;A * pa=(A*)&b;
同型号的类型基本上都可以转换。没有限制
int a; double *pb=static_cast<double *>(&a); 不可以 double *pb=(double *) (&a);
static_cast<T>(exp):和强制类型转换类似,但更安全,会进行一部分检查。
如B b;A * pa=(A*)&b; 当A和B类无关联的时候,不能转换。若是父类子类的关系就能转换。
int a;double *pb=static_cast<double *>(&a); 不能转换和隐式类型转换很像。
dynamic_cast<T>(exp):动态类型识别。
①T只能是类的指针,类的引用,void*
②向下类型转换的基类必须要有虚函数,才能使用
③动态类型,转换失败返回nullptr
④向上类型转换非虚函数也可以
const_cast<T>(exp):可以去掉const或增加const.
T和exp的类型除了const必须一致。
把类这块单独提出来:
向上类型转换都是可以的
①有关虚基类
1.虚基类可以向上类型转换,但是无论哪种方法都不能向下类型转换
2.虚函数存在的情况下,可以用dynamic_cast(明确指明)向下类型转换
②有关虚函数
dynamic_cast可以向下类型转换
③普通公有继承
1.static_cast和 强制类型转换 可以向下类型转换 //不保证安全性
2.隐式类型转换 不能向下类型转换
3.static_cast 只能在父类和子类之间转换
#include <iostream>
using namespace std;
class A{
public:
int a=1;
};
class B:public A{
public:
int b=0;
};
int main(void){
B b;
B *pb=&b;
A * pa= pb;
cout<<pa->a;
pb=dynamic_cast<B *>(pa);//错误!!!!错误不在A是虚基类,错在没有虚函数!!!!
pb=pa;//错误,A *和B *是不同类型 就算有虚函数也只能向上类型转换
pb=static_cast<B *>(pa);//正确,但static_cast不保证安全性
}