//類繼承中的重名成員 #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"); }