C++基礎:繼承與派生(聲明 繼承方式 訪問規則)

繼承是面向對象程序設計中的重要特性,是軟件複用的一種形式。其實繼承和派生就是同一種概念的不同說法罷了,通常我們說子類繼承父類,父類派生出子類。先講一下C++中派生與繼承的基本概念,它是之後學習派生類的構造與析構,以及多重繼承等的基礎。

  1.派生類的聲明

  聲明一個派生類的一般格式:

  class 派生類名:[繼承方式] 基類名

  {

     派生類新增的數據成員和成員函數

  };

  對於上述的格式主要想說一下繼承方式的作用,它主要是規定如何訪問從基類繼承的成員。它可以有關鍵字private、protected和public來分別表示私有繼承、保護繼承和公有繼承。如果不顯示繼承方式關鍵字,系統默認爲私有繼承。繼承方式指定類派生類成員以及類外對象對於從基類繼承來的成員的訪問權限。

  2.基類成員在派生類中的訪問屬性

對於不同的繼承方式,基類成員在派生類中的訪問屬性也是不同的,以下表,列出了基類成員在派生類中的訪問屬性:

 

按繼承方式 對比:

 

3.派生類對基類成員的訪問規則,無非訪問方式就兩種:內部訪問和對象訪問。同樣的3中繼承方式下,派生類對基類成員的訪問也分爲3類:

(1).私有繼承的訪問規則

View Code 
 #include "stdafx.h"
 #include <iostream>
 
 class A
 {
 private:
 int a1;
 protected:
 int a2;
 public:
 int a3;
         A(int a1);
 void showA();
 };
 
 A::A(int a1)
 {
 this->a1=a1;
 }
 void A::showA()
 {
     std::cout<<"a1="<<this->a1<<std::endl;
 }
 
 class B:private A
 {
 private:
 int b;
 public:
         B(int b,int a1,int a2,int a3);
 void showB();
 };
 
 B::B(int b,int a1,int a2,int a3):A(a1)
 {
 this->a2=a2;//內部可以訪問
 this->a3=a3;//內部可以訪問
 this->b=b;
 }
 
 void B::showB()
 {
 //std::cout<<"a1="<<this->a1<<std::endl;不可訪問
     showA();//間接訪問
     std::cout<<"a2="<<this->a2<<std::endl;
     std::cout<<"a3="<<this->a3<<std::endl;
     std::cout<<"b="<<this->b<<std::endl;
 }
 
 
 int main()
 {
     B b(4,1,2,3);
 //b.a1=5;//類外不可訪問
 //b.a3=5;類外不可訪問
 //b.a2=5;類外不可訪問
 //b.showA();類外不可訪問
     b.showB();
 
 return0;
 }

結果:

由以上示例可小結

私有繼承那麼派生類繼承下來的基類中的成員,在派生類中就都成爲了私有成員,因此,派生類的對象訪問任何基類中的成員(數據成員a1,a2,a3和成員函數showA())都不允許,而派生類內部不可訪問基類中的私有成員(a1),可訪問保護成員(a2)和公有成員(數據成員a3,成員函數showA());

 

(2).保護繼承的訪問規則

//對上述示例代碼中的private繼承換爲protected

由以上示例可小結(運行結果和上一示例相同)

保護繼承那麼派生類繼承下來的基類中的成員,除了私有的基類成員不變外,在派生類中就都成爲了保護成員,因此,派生類內部不可訪問基類中的私有成員(a1),可訪問保護成員(a2)和公有成員(數據成員a3,成員函數showA());而派生類的對象訪問任何基類中的成員(數據成員a1,a2,a3和成員函數showA())都不允許,a1是私有成員,不能訪問,但a2,a3和showA()被繼承下來在派生類中是保護成員,它們不能訪問是因爲protected保護類型的成員可以被本類的成員函數訪問,也可以被繼承被類的的派生類成員函數訪問,但類以外的任何訪問都不允許,即它爲半隱蔽的。

(3).公有繼承的訪問規則

示例:

 #include "stdafx.h"
 #include <iostream>
 
 class A
 {
 private:
 int a1;
 protected:
 int a2;
 public:
 int a3;
         A(int a1);
 void showA();
 };
 
 A::A(int a1)
 {
 this->a1=a1;
 }
 void A::showA()
 {
     std::cout<<"a1="<<this->a1<<std::endl;
 }
 
 class B:public A //公有繼承
 {
 private:
 int b;
 public:
         B(int b,int a1,int a2,int a3);
 void showB();
 };
 
 B::B(int b,int a1,int a2,int a3):A(a1)
 {
 this->a2=a2;//內部可以訪問
 this->a3=a3;//內部可以訪問
 this->b=b;
 }
 
 void B::showB()
 {
 //std::cout<<"a1="<<this->a1<<std::endl;不可訪問
 //showA();//間接訪問
     std::cout<<"a2="<<this->a2<<std::endl;
     std::cout<<"a3="<<this->a3<<std::endl;
     std::cout<<"b="<<this->b<<std::endl;
 }
 
 
 
 
 int main()
 {
     B b(4,1,2,3);
 //b.a1=5;//類外不可訪問    
 //b.a2=5;類外不可訪問
     b.a3=5;
     b.showA();
     b.showB();
 
 return0;
 }

結果:

由以上示例可小結

公有繼承那麼派生類繼承下來的基類中的成員,除了私有的基類成員和保護的基類成員不變外,在派生類中就都成爲了公有成員,因此,派生類內部不可訪問基類中的私有成員(a1),可訪問保護成員(a2)和公有成員(數據成員a3,成員函數showA());而派生類的對象可以訪問基類中數據成員a3和成員函數showA(),但不允許訪問私有成員a1和保護成員a2。

  4.最後總結一下,其實這節所講的內容歸根到底就是對於繼承方式的理解,以及從繼承方式所引出的訪問屬性和規則的相對應的不同區別。因爲覺得直接用文字來表達,看起來會比較亂,所以試着參入表格和示例小結來說明。希望這樣能達到讀者在看這篇隨筆時不會覺得思緒很混亂!

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章