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

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

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

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

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

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

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

猜你喜欢

转载自www.cnblogs.com/xiaobaizzz/p/12350345.html