衍生類別繼承基類
記憶體配置時,是在於基類對象不同的記憶體位址處,按基類的成員變數類型,開闢一個同樣的類型空間,但注意開闢後派生對象的空間,不是複製基類的成員的值,而是僅僅開闢那種成員類型的空間,未初始化時,裡面存在的數是不確定的
然後衍生類別自己定義的成員變數是排在繼承的A類成員下面,如果衍生類別定義的變數名與基類相同,則此變數覆蓋掉繼承的基類同名變數,注意,覆蓋不是刪除,也
就是衍生類別中繼承自基類的成員變數依然存在,而且值也不發生變化。如果想用此繼承自基類的成員變數,則要加:: ,
在成員函數中訪問時,直接用base::i,即可,用衍生類別的對象a訪問時,如果此繼承自基類的成員變數是對象可訪問的(Public類型),則用
a.base::i訪問之
Base base;
Sub_class sub;
base.i;
base.j
但是用對象訪問衍生類別的繼承自基類的成員變數時(假定public類型)
得用:
sub.Base::i
sub.Base::j
直接用sub.i, 訪問的是子類自訂的i
如 以下程式
- class base{
- public:
- int i;
- int j;
- };
- class sub:public base{
- public:
- int i;
- int j;
- void p(){
- cout<<base::i<<endl;
- cout<<base::j<<endl;
- }
- };
- base b;
- sub s;
- b.i=1;
- b.j=2;
- s.i=3;
- s.j=4;
- s.p(); // 輸出兩個不確定的數 4425598 4421322
- cout<<b.i<<endl; // 1
- cout<<b.j<<endl; // 2
- cout<<s.i<<endl; // 3
- cout<<s.j<<endl; // 4
- cout<<s.base::i<<endl;
- cout<<s.base::j<<endl;
輸出結果如下
4425598
4421322
1
2
3
4
4425598
4421322
Press any key to continue . . .
從衍生類別對象繼承的兩個基類變數的值和及基類對象兩個成員變數的值得比較看,足以驗證上述結論:
子類繼承的基類的成員,只是在另一個記憶體空間內開闢一個這種類型的成員變數,它的值並不是基類的值,編譯器只是負責把這一部分空間類型設定為與基類的類型相同