[C++]繼承和派生類

丫就是熊個貓貓發表於2016-12-10

繼承和派生類

繼承性是物件導向程式設計中最重要的機制。這種機制提供了無限重複利用程式資源的一種途徑。通過C++語言中的繼承機制,可以擴充和完善舊的程式設計以適應新的需求。這樣不僅可以節省程式開發的時間和資源,並且為未來程式增添了新的資源。

class Student

{   int num;

    char name[30];

    char sex;

 public:                             

   void display( )                    //對成員函式display的定義

    {cout<<"num: "<<num<<endl;

     cout<<"name: "<<name<<endl;

     cout<<"sex: "<<sex<<endl; }

};

class Studend1

{    int num;          //此行原來己有

     char name[20];       //此行原來己有

     char sex;         //此行原來己有

   int age;

   char addr[20];

public:            

   void display( ) ;         //此行原來己有

    {cout<<"num: "<<num<<endl;    //此行原來己有

     cout<<"name: "<<name<<endl;//此行原來己有

     cout<<"sex: "<<sex<<endl;      //此行原來己有

     cout<<"age: "<<age<<endl;

     cout<<"address: "<<addr<<endl;}                 

}; 

利用原來定義的類Student作為基礎,再加上新的內容即可,以減少重複的工作量。 C++提供的繼承機制就是為了解決這個問題。

在C++中所謂“繼承”就是在一個已存在的類的基礎上建立一個新的類。已存在的類稱為“基類(base class)”或“父類(father class)”。新建立的類稱為“派生類(derived class)”或“子類(son class)”。

class Student1: public Student//宣告基類是Student

{private:

      int age;    //新增加的資料成員

    string addr;  //新增加的資料成員

public:

   void display_1( )  //新增加的成員函式

   {  cout<<"age: "<<age<<endl;

   cout<<"address: "<<addr<<endl;

}   

};

類A派生類B:類A為基類,類B為派生類。

 

在C++語言中,一個派生類可以從一個基類派生,也可以從多個基類派生。從一個基類派生的繼承稱為單繼承;從多個基類派生的繼承稱為多繼承。

通過繼承機制,可以利用已有的資料型別來定義新的資料型別。所定義的新的資料型別不僅擁有新定義的成員,而且還同時擁有舊的成員。我們稱已存在的用來派生新類的類為基類,又稱為父類。由已存在的類派生出的新類稱為派生類,又稱為子類。

在建立派生類的過程中,基類不會做任何改變,派生類則除了繼承基類的所有可引用的成員變數和成員函式外,還可另外定義本身的成員變數和處理這些變數的函式,由於派生類可繼承基類的成員變數和成員函式,因此在基類中定義好的資料和函式等的程式程式碼可重複使用,這樣可以提高程式的可靠性。

當從已有的類中派生出新的類時,可以對派生類做以下幾種變化:

1、 可以繼承基類的成員資料或成員函式。

2、可以增加新的成員變數。

3、可以增加新的成員函式。

4、可以重新定義已有的成員函式。

5、可以改變現有的成員屬性。

在C++中有二種繼承:單一繼承和多重繼承。當一個派生類僅由一個基類派生時,稱為單一繼承;而當一個派生類由二個或更多個基類所派生時,稱為多重繼承。

 

類A派生類B:類A為基類,類B為派生類。

 

但派生並不是簡單的擴充,有可能改變基類的性質。

有三種派生方式:公有派生、保護派生、私有派生。

預設的是私有派生。

從一個基類派生一個類的一般格式為:

class  ClassName:<Access>BaseClassName

{

       private:  

        ......; //私有成員說明

       public:  

        ......; //公有成員說明

       protected:  

        ......; //保護成員說明

  }

public: 表示公有基類

private:表示私有基類(預設)

protected:表示保護基類

ClassName:派生類名

Access:繼承方式

BaseClassName:基類名

 

公有派生

class  ClassName:   public BaseClassName

public:公有派生,派生類中保持基類的成員特性

公有派生時,基類中所有成員在派生類中保持各個成員的訪問許可權。

 

基類:public:   在派生類和類外可以使用

  protected: 在派生類中使用

  private: 不能在派生類中使用

 

保護派生

class  ClassName:   protected  BaseClassName

protected:保護派生,派生類中基類公有和保護成員降級使用

保護派生時,基類中公有成員和保護成員在派生類中均變為保護的和私有的,在派生類中仍可直接使用這些成員,基類中的私有成員,在派生類中不可直接使用。

protected 成員是一種具有血緣關係內外有別的成員。它對派生類的物件而言,是公開成員,可以訪問,對血緣外部而言,與私有成員一樣被隱蔽。

 

抽象類與保護的成員函式

當定義了一個類,這個類只能用作基類來派生出新的類,而不能用這種類來定義物件時,稱這種類為抽象類。當對某些特殊的物件要進行很好地封裝時,需要定義抽象類。

將類的建構函式或解構函式的訪問許可權定義為保護的時,這種類為抽象類。

當把類中的建構函式或解構函式說明為私有的時,所定義的類通常是沒有任何實用意義的,一般情況下,不能用它來產生物件,也不能用它來產生派生類。

 

 

多重繼承

可以用多個基類來派生一個類。

 

格式為:

class  類名:<Access>類名1,..., <Access>類名n

{

      private:     ...... ;   //私有成員說明;

      public:      ...... ;   //公有成員說明;

      protected:   ...... ;   //保護的成員說明;

};

class  D: public  A, protected B, private C

{    ....//派生類中新增加成員

};

 

初始化基類成員

建構函式不能被繼承,派生類的建構函式必須呼叫基類的建構函式來初始化基類成員基類子物件。

派生類建構函式的呼叫順序如下:

基類的建構函式

子物件類的建構函式

派生類的建構函式

class B:public A{

         int  y;                                   基類的建構函式

         A  a1;                                   子物件類的建構函式

public:                                            派生類的建構函式

         B(int a, int b):A(a),a1(3){y=b;}

         .......

};

當撤銷派生類物件時,解構函式的呼叫正好相反。

 

基類與物件成員

任一基類在派生類中只能繼承一次,否則,會造成成員名的衝突

若在派生類中,確實要有二個以上基類的成員,則可用基類的二個物件作為派生類的成員。

把一個類作為派生類的基類或把一個類的物件作為一個類的成員,在使用上是有區別的:在派生類中可直接使用基類的成員(訪問許可權允許的話),但要使用物件成員的成員時,必須在物件名後加上成員運算子“.”和成員名。

在平面上作兩個點,連一直線,求直線的長度和直線中點的座標。

基類為Dot,有兩個公有資料成員,即平面上的座標(x,y),同時有建構函式及列印函式。

派生類為Line,有兩個基類Dot物件,分別存放兩點的座標,同時,從基類繼承了一個Dot資料,存放直線中點的座標。

再次強調,用虛基類進行多重派生時,若虛基類沒有預設的建構函式,則在每一個派生類的建構函式中都必須有對虛基類建構函式的呼叫 (且首先呼叫)。

 

相關文章