C++ 子類對象直接賦值給父類對象可行,反過來不行


一.總結

(1)子類對象中既包含父類中繼承來的變量,還包括自身所特有的.當把子類對象去賦值給父類對象時,把兩者共有的部分進行了賦值.(有篇文章反映了兩者的內存關系:https://www.cnblogs.com/taiyonghai/p/6515979.html)

(2)反之,父類對象賦值給子類對象時,由於父類對象不能夠提供子類對象所特有的變量,因此會報錯.

(3)對象指針也有這樣的使用規則,子類指針可以直接賦值給父類指針.而將父類指針賦值給子類時,需要使用顯示類型轉換.

感覺編譯器很勢利眼,禮多人不怪(子類轉成父類),少了就報錯(反之).

二.代碼示例

#include <iostream>
using namespace std;

class A
{
public:
    int a;
    int b;
};

class B : public A
{
public:
    B()
    {
        a = 10;
        b = 20;
    }
    int a;
    int b;
    void func()
    {
        A::a = 100;    //對繼承來的部分進行操作,只能在類中進行.
        A::b = 200;
    }
};

int main()
{
    cout << sizeof(A) << endl;
    cout << sizeof(B) << endl;

    //子類賦值給父類,只是對父類的那部分進行的賦值.非父類的那部分被"截斷了"
    A a;
    B b;
    a = b;
    cout << "a.a:" << a.a << " a.b:" << a.b << endl;
    cout << "b.a:" << b.a << " b.b:" << b.b << endl;

    cout << sizeof(a) << endl;
    cout << sizeof(b) << endl;

    b.func(); //子類對父類的成員進行了修改.
    a = b;
    cout << "a.a:" << a.a << " a.b:" << a.b << endl;
    cout << "b.a:" << b.a << " b.b:" << b.b << endl;

    //不存在父類賦值到子類的操作
    //b = a;
    return 0;
}
//在VS2015 x86下運行的.
運行結果:
8
16
a.a:-858993460 a.b:-858993460
b.a:10 b.b:20
8
16
a.a:100 a.b:200
b.a:10 b.b:20

 

參考文章:

1.https://blog.csdn.net/yhblog/article/details/101101465

2.https://blog.csdn.net/qq_25847123/article/details/48678985


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM