• C++ 将派生类赋值给基类(向上转型)


    数据类型的转换

    类其实也是一种数据类型,也可以发生数据类型转换,不过这种转换只有在基类和派生类之间才有意义,并且只能将派生类赋值给基类。

    向上转型(Upcasting):将派生类赋值给基类,非常安全,可以由编译器自动完成。
    向下转型(Downcasting):将基类赋值给派生类,有风险,需要程序员手动干预。

    将派生类对象赋值给基类对象

    #include <iostream>
    using namespace std;
    //基类
    class A{
    public:
        A(int a);
    public:
        void display();
    public:
        int m_a;
    };
    A::A(int a): m_a(a){ }
    void A::display(){
        cout<<"Class A: m_a="<<m_a<<endl;
    }
    //派生类
    class B: public A{
    public:
        B(int a, int b);
    public:
        void display();
    public:
        int m_b;
    };
    B::B(int a, int b): A(a), m_b(b){ }
    void B::display(){
        cout<<"Class B: m_a="<<m_a<<", m_b="<<m_b<<endl;
    }
    int main(){
        A a(10);
        B b(66, 99);
        //赋值前
        a.display();
        b.display();
        cout<<"--------------"<<endl;
        //赋值后
        a = b; //将派生类B的对象b赋值给基类A的对象a
        a.display();
        b.display();
        return 0;
    }
    
    /*运行结果:*/
    Class A: m_a=10
    Class B: m_a=66, m_b=99
    --------------
    Class A: m_a=66
    Class B: m_a=66, m_b=99
    

    赋值的本质是将现有的数据写入已经分配好的内存中,对象的内存只包含成员变量,所以对象之间的赋值是成员变量的赋值,成员函数不存在赋值问题。

    将派生类指针赋值给基类指针

    通过基类指针访问派生类的成员:

    总结:编译器通过指针来访问成员变量,指针指向哪个对象就使用哪个对象的数据;编译器通过指针的类型来访问成员函数,指针属于哪个类的类型就使用哪个类的函数。

    将派生类引用赋值给基类引用

    引用本质上是通过指针实现的,引用仅仅是对指针进行了简单封装。

  • 相关阅读:
    es(四)IK分词器和ElasticSearch集成使用
    es(三)使用postman来管理es数据
    es7.+(一)检索
    es7.+(二)进阶索引
    es7.+(三)mapping
    es(六)ElasticSearch的java编程操作
    es配置允许跨域和外网访问
    es(五)ElasticSearch集群
    C#数据导出到Excel源代码
    jQuery实现页内锚点平滑跳转
  • 原文地址:https://www.cnblogs.com/xiaobaizzz/p/12350345.html
Copyright © 2020-2023  润新知