1:dynamic_cast
(1)指针之间的转换:(子类相比父类多出一些内容)(子类指针无法指向内存中的父类实例)
子类指针转换为父类指针,成功;
父类指针转换为子类指针分为两种情况:(此时使用dynamic_cast需要保证基类中存在虚函数)
<a>:父类指针指向的是子类对象,成功;
<b>:父类指针指向的是父类对象,可以成功,但是通过转换后的子类指针访问的子类专属成员为NULL。
(2)引用与引用之间的转换:(与指针类似)(子类引用无法引用父类实例,因为访问一些成员时出问题)
子类引用转换为父类,成功;
父类引用转换为子类分两种情况:(此时使用dynamic_cast需要保证基类中存在虚函数,即多态存在)
<a>:父类引用引用子类对象,成功;(通过该父类引用访问父类成员)
<b>:父类引用引用父类对象,出错,抛出bad_cast;
(3)其它将NULL指针转换为任何类型的指针,将任何类型的指针转换为void*指针。
2:static_cast (父类子类转换时,不要求多态,但是当子类的指针通过static_cast而指向父类对象时,访问一些子类独有成员便变为0,存在一定不安全性不能在编译期间检测)
static_cast可转换任何相关联的类,可以将父类转换为子类,也可以将子类转换为父类;
(1)父类指针指向父类对象,将父类指针static_cast转换为子类指针;成功,此时子类指针指向父类对象的地址,但sizeof不同,子类指针对应的子类独有成员被填充为0.
(2)父类指针指向子类对象,将父类指针static_cast转换为子类指针;成功,此时子类指针指向子类对象的地址。
(3)子类指针指向父类对象,x (子类指针不可指向父类对象)
(4)子类指针指向子类对象,将子类指针static_cast转换为父类指针;成功,此时父类指针指向子类对象的地址,但sizeof不同,父类指针只访问从父类继承来的成员。
通过引用访问一样。
static还可用于一些基本类型的隐式转换。
3:reinterpret_cast
该操作不会进行动态类型或静态类型的转换,它仅仅将值强行赋值过去。从某种意义上对编译器进行了一种欺骗,同时带来一定不安全性。所以慎重使用。以下是reinterpret_cast的常用情况:
(1)int和指针之间的相互转换;
(2)无关联类指针之间的转换;
(3)函数指针之间的转换;
4:const_cast
去除指针或引用上的const和volatile属性。
const指针和引用指示编译器不能通过此对所指向或引用的对象进行修改,const_cast去除这种属性。