基類,衍生類別,記憶體配置情況

來源:互聯網
上載者:User
衍生類別繼承基類
      記憶體配置時,是在於基類對象不同的記憶體位址處,按基類的成員變數類型,開闢一個同樣的類型空間,但注意開闢後派生對象的空間,不是複製基類的成員的值,而是僅僅開闢那種成員類型的空間,未初始化時,裡面存在的數是不確定的
      
然後衍生類別自己定義的成員變數是排在繼承的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

如 以下程式

  1. class base{
  2. public:
  3.       int i;
  4.       int j;
  5. };
  6. class sub:public base{
  7.  public:
  8.          int i;
  9.          int j;
  10.     void p(){
  11.               cout<<base::i<<endl;
  12.               cout<<base::j<<endl;
  13.              }        
  14. };  
  15. base b;
  16. sub s;
  17. b.i=1;
  18. b.j=2;
  19. s.i=3;
  20. s.j=4;
  21. s.p();             //   輸出兩個不確定的數 4425598   4421322
  22. cout<<b.i<<endl;  //   1
  23. cout<<b.j<<endl;   //   2
  24. cout<<s.i<<endl;   //   3
  25. cout<<s.j<<endl;   //   4
  26. cout<<s.base::i<<endl;
  27. cout<<s.base::j<<endl;

輸出結果如下
4425598
4421322
1
2
3
4
4425598
4421322
Press any key to continue . . .

從衍生類別對象繼承的兩個基類變數的值和及基類對象兩個成員變數的值得比較看,足以驗證上述結論:
子類繼承的基類的成員,只是在另一個記憶體空間內開闢一個這種類型的成員變數,它的值並不是基類的值,編譯器只是負責把這一部分空間類型設定為與基類的類型相同

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.