基類,派生類,記憶體分配情況
派生類繼承基類
記憶體分配時,是在於基類物件不同的記憶體地址處,按基類的成員變數型別,開闢一個同樣的型別空間,但注意開闢後派生物件的空間,不是複製基類的成員的值,而是僅僅開闢那種成員型別的空間,未初始化時,裡面存在的數是不確定的
然後派生類自己定義的成員變數是排在繼承的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:
int i;
int j;
void p(){
cout<<
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 . . .
從派生類物件繼承的兩個基類變數的值和及基類物件兩個成員變數的值得比較看,足以驗證上述結論:
子類繼承的基類的成員,只是在另一個記憶體空間內開闢一個這種型別的成員變數,它的值並不是基類的值,編譯器只是負責把這一部分空間型別設定為與基類的型別相同