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

  • 相关阅读:
    全排列(求所有情况的个数)--10--全排列--蓝桥杯凑算式和leetcode46全排列
    DFS+BFS(广度优先搜索弥补深度优先搜索遍历漏洞求合格条件总数)--09--DFS+BFS--蓝桥杯剪邮票
    Powermock2.0.0 详细 总结
    Springboot 前后端数据传输 常见误区
    idea src下源文件和class编译文件不一致
    java对象clone
    数据结构-链表
    队列
    稀疏数组
    数据库隔离级别
  • 原文地址:https://www.cnblogs.com/cjj-ggboy/p/12354080.html
Copyright © 2020-2023  润新知