C++四种cast

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去除这种属性。

原文链接: https://www.cnblogs.com/cjj-ggboy/p/12354080.html

欢迎关注

微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍

    C++四种cast

原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/193477

非原创文章文中已经注明原地址,如有侵权,联系删除

关注公众号【高性能架构探索】,第一时间获取最新文章

转载文章受原作者版权保护。转载请注明原作者出处!

(0)
上一篇 2023年2月12日 下午6:23
下一篇 2023年2月12日 下午6:23

相关推荐