1. 程式人生 > >繼承 總結

繼承 總結

繼承:在已有類的基礎上建立新類的過程
  一個 B 類繼承A類,或稱從類 A 派生類 B

     類 A 稱為基類(父類),類 B 稱為派生類(子類)

基類名錶  構成

訪問控制  基類名1, 訪問控制  基類名2 ,… , 訪問控制  基類名n

訪問控制 表示派生類對基類的繼承方式,使用關鍵字:
  public 公有繼承
  private 私有繼承

  protected 保護繼承

派生類的生成過程經歷了三個步驟:
       ●吸收基類成員(全部吸收(構造、析構除外),但不一定可見)
       ●改造基類成員

       ●新增派生類新成員

吸收基類成員 :在C++的繼承機制中,派生類吸收基類中除建構函式和解構函式之外的全部成員。 改造基類成員:通過在派生類中定義同名成員(包括成員函式和資料成員)來遮蔽(隱藏)在派生類中不起作用的部分基類成員。新增新成員:僅僅繼承基類的成員是不夠的,需要在派生類中新增新成員,以保證派生類自身特殊屬性和行為的實現。 

重名成員:派生類定義了與基類同名的成員,在派生類中訪問同名成員時遮蔽(hide)了基類的同名成員。在派生類中使用基類的同名成員,顯式地使用類名限定符:類名 :: 成員 

派生類中訪問靜態成員:基類定義的靜態成員,將被所有派生類共享(基類和派生類共享基類中的靜態成員)根據靜態成員自身的訪問特性和派生類的繼承方式,在類層次體系中具有不同的訪問性質 。 派生類中訪問靜態成員,用以下形式顯式說明:類名 :: 成員或通過物件訪問

物件名 . 成員

基類的初始化:在建立派生類物件時用指定引數呼叫基類的建構函式來初始化派生類繼承基類的資料。派生類建構函式宣告為派生類建構函式 ( 變元表 ) : 基類 ( 變元表 ) , 物件成員1( 變元表 )… 物件成員n ( 變元表 ) ; 建構函式執行順序:基類  物件成員 派生類

派生類建構函式和解構函式的定義規則:派生類建構函式和解構函式的使用原則;基類的建構函式和解構函式不能被繼承;如果基類沒有定義建構函式或有無參的建構函式, 派生類也可以不用定義建構函式;如果基類無無參的建構函式,派生類必須定義建構函式;如果派生類的基類也是派生類,則每個派生類只負責直接基類的構造;派生類是否定義解構函式與所屬的基類無關

派生類建構函式的定義:在C++中,派生類建構函式的一般格式為:
      派生類::派生類名(引數總表):基類名(引數表)
     {
             // 派生類新增成員的初始化語句
     }
     注意:這是基類有建構函式且含有引數時使用
派生類解構函式:(1)當派生類中不含物件成員時
●在建立派生類物件時,建構函式的執行順序是:基類的建構函式→派生類的建構函式;
●在撤消派生類物件時,解構函式的執行順序是:派生類的解構函式→基類的解構函式。
(2)當派生類中含有物件成員時
●在定義派生類物件時,建構函式的執行順序:基類的建構函式→物件成員的建構函式→派生類的建構函式;
●在撤消派生類物件時,解構函式的執行順序:派生類的解構函式→物件成員的解構函式→基類的解構函式。
例題:定義一個基類person(不定義建構函式)
姓名、性別、年齡(訪問許可權設定為私有)
定義公有的成員函式set_p()

定義公有的成員函式display_p(),顯示person的資訊

#include<iostream>

#include <string>
using namespace std;
class Person
{
string name;
int age;
string sex;
public:
void set_p() {
cout<<"name\tage\tsex"<<endl;
cin>>name>>age>>sex;
}
void show_p() {
  cout<<name<<"  "<<age<<"  "<<sex<<endl;
}

};

class student :public Person
{
string no;
string zhuanye;
string t_class;
float score;
public:
void set_t(){
      set_p(); //呼叫繼承於基類的成員函式訪問繼承於基類的私有資料成員
    cout<<"zhuanye\tt_class\tscore"<<endl;
    cin>>zhuanye>>t_class>>score;
}
void show_t() {
show_p();
cout<<zhuanye<<"  "<<t_class<<"  "<<score<<endl;
}

};

心得:1)繼承是面向物件程式設計實現軟體重用的重要方法。能夠在已有基類的基礎上定義新的派生類。 
2) 單繼承的派生類僅僅有一個基類。多繼承的派生類有多個基類。
3) 派生類對基類成員的訪問由繼承方式和成員性質決定。
4) 建立派生類物件時,先呼叫基類建構函式初始化派生類中的基類成員。呼叫解構函式的次序和呼叫建構函式的次序相反。 
5)C++提供虛繼承機制,防止類繼承關係中成員訪問的二義性。 

     使用三種繼承方式時需要注意以下幾個方面:1. 基類的private成員在派生類中是不能被訪問的,如果基類成員不想在類外直接被訪問,但需要 在派生類中能訪問,就定義為protected。可以看出保護成員限定符是因繼承才出現的。2. public繼承是一個介面繼承,保持is-a原則,每個父類可用的成員對子類也可用,因為每個子類 物件也都是一個父類物件。3. protected/private繼承是一個實現繼承,基類的部分成員並非完全成為子類介面的一部分, 是 has-a 的關係原則,所以非特殊情況下不會使用這兩種繼承關係,在絕大多數的場景下使用的 都是公有繼承。私有繼承以為這is-implemented-in-terms-of(是根據……實現的)。通常比 組合(composition)更低階,但當一個派生類需要訪問基類保護成員或需要重定義基類的虛函 數時它就是合理的。4. 不管是哪種繼承方式,在派生類內部都可以訪問基類的公有成員和保護成員,基類的私有成員存 在但是在子類中不可見(不能訪問)。  5. 使用關鍵字class時預設的繼承方式是private,使用struct時預設的繼承方式是public,不過最好顯示的寫出繼承方式。