• C++程序设计方法3:强制类型转换


    强制类型转换(显示转换)

    dynamic_cast<Dst_Type>(Src_var)

    Src_var必须是引用或者指针类型,Dst_Type类中含有虚函数,否则会有编译错误;

    若目标类与源类之间没有继承关系,则转化失败,返回空指针(注:失败并不是运行崩溃)

    static_cast<Dst_Type>(Src_var)

    基类对象不能转换为派生类对象,但基类指针可以转换为派生类的指针

    派生类对象(指针)可以转化为基类的对象(指针)

    没有继承关系的类之间,必须具有转换途径才能进行转换(要么自定义,要么是语言语法支持)

    #include <iostream>
    using namespace std;
    
    class B
    {
    public:
        virtual void f() {}
    };
    
    class D :public B {};
    class E {};
    
    int main()
    {
        D d1;
        B b1;
        //d1 = static_cast<D> (b1);//error:从基类无法转换回派生类
        b1 = static_cast<B>(d1);
        //b1 = dynamic_cast<B>(d1);//error:被转化的必须是指针或者引用
        B* pb1 = new B();
        D* pd1 = static_cast<D*>(pb1);
        if (pd1)
            cout << "ok" << endl;//基类指针可以转换为派生类的指针
        pd1 = dynamic_cast<D*>(pb1);
        if (pd1)
            cout << "ok" << endl;//基类不可以动态转化为派生类
    
        D* pd2 = new D();
        B* pb2 = static_cast<B*>(pd2);
        if (pb2)
            cout << "ok" << endl;//ok
        pb2 = dynamic_cast<B*>(pd2);
        if (pb2)
            cout << "ok" << endl;//ok
    
        E* pe = dynamic_cast<E*>(pb1);
        if (!pe)
            cout << "ok" << endl;//ok
    
        //pe = static_cast<E*>(pb1);//error:没有继承关系不能转换
        // E e = static_cast<E>(b1);//error:没有提供转换的途径
        return 0;
    }
    怕什么真理无穷,进一寸有一寸的欢喜。---胡适
  • 相关阅读:
    const---ES6的新特性---从js角度理解
    mpvue搭建微信小程序
    get和post区别,面试中经典答法
    Deno增删查改(CRUD)应用
    Thymeleaf货币转换
    Spring Security和Spring Core 依赖冲突
    Java15于2020/09/15发版
    WebFlux系列(十三)MySql应用新增、修改、查询、删除
    WebFlux系列(十二)MongoDB应用,新增、修改、查询、删除
    Spring Boot(4) Mongo数据库新增、删除、查询、修改
  • 原文地址:https://www.cnblogs.com/hujianglang/p/6654210.html
Copyright © 2020-2023  润新知