C++ 類的繼承四(類繼承中的重名成員)


//類繼承中的重名成員
#include<iostream>
using namespace std;

/*
自己猜想:

對於子類中的與父類重名的成員,c++編譯器會單獨為子類的這個成員變量再開辟一塊內存空間,
把這個重名的成員變量當成子類的獨有屬性
在子類對象中如果訪問重名成員,會默認訪問子類獨有那個成員變量,而不是訪問父類的成員變量

對於從父類繼承的所有成員,c++編譯器會在子類對象的內存空間前部分放置父類的所有成員
父類的成員函數訪問的都是  子類對象中  父類內存空間那部分的成員變量,
--如果不是這樣,那么父類中能訪問子類成員變量?
又因為子類對象的重名成員  是獨立於父類    屬於子類對象的一個成員變量

對於被子類繼承的父類的成員函數 訪問的是父類中的那個重名成員的解釋
根據類的對象管理模型,類的非靜態成員函數就是一個全局函數,只是函數中默認有一個對象指針參數
對於父類成員函數而言,父類成員函數有一個參數就是父類對象指針,
此時子類對象調用父類成員函數,不就是類的賦值兼容性原則嗎--父類指針調用子類對象,
父類對象指針不強轉成子類對象指針,那么這個父類指針不是只能訪問父類對象的成員嗎?
因此得出結論,子類對象調用繼承於父類的成員函數 訪問的是父類中的那個重名成員
*/

/*
總結:
派生類定義了與基類同名的成員,在派生類中訪問同名成員時屏蔽了基類的同名成員 在派生類中使用基類的同名成員,顯式的使用類名限定符 ----- 類名::成員 */

class PointA{
public:
    int x;
    int y;
    void PrintA(){
        cout << "x=" << x << ";y=" << y << endl;
    }
    void PrintB(){
        cout << "x=" << x << ";y=" << y << endl;
    }
};

class PointB :public PointA{
public:
    PointB(){
        x = 3;
        y = 8;
        z = 7;
        //在子類內部中給可訪問父類成員屬性賦值
        PointA::y = 11;
    }
    int y;
    int z;
    void Test1(){
        cout << "z=" << z << ";y=" << y << endl;
    }
    void PrintB(){
        cout << "z=" << z << ";y=" << y << endl;
    }
};

void ProtectA(){
    PointB pb1;
    pb1.PrintA();
    cout << "----------------" << endl;
    pb1.Test1();
    cout << "----------------" << endl;
    pb1.y = 33;
    //在子類外部中給可訪問父類成員屬性賦值
    pb1.PointA::y = 44;
    pb1.PrintA();
    cout << "----------------" << endl;
    pb1.Test1();
}

void ProtectB(){
    PointB pb1;
    //對於重名函數調用規則和重名變量規則類似
    pb1.PrintB();
    cout << "--------------------" << endl;
    pb1.PointA::PrintB();
}

void main(){
    //ProtectA();
    ProtectB();
    system("pause");
}

 


免責聲明!

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



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