C++繼承



面向物件程式設計中最重要的概念之一就是繼承。繼承允許我們根據另一個類來定義一個類,這使得建立和維護應用程式更加容易。這也提供了重用程式碼功能和加快實現時間的機會。

在建立類時,程式設計師可以指定新類應該繼承現有類的成員,而不是編寫全新的資料成員和成員函式。這個現有類稱為**基類**,新類稱為**派生類**。

繼承的概念實現了**是-a**關係。例如,哺乳動物是動物,狗是哺乳動物,因此狗也是動物,以此類推。

基類和派生類

一個類可以從多個類派生,這意味著它可以繼承多個基類的數和函式。為了定義派生類,我們使用類派生列表來指定基類。類派生列表命名一個或多個基類,其形式如下:

class derived-class: access-specifier base-class

其中訪問說明符是**public、protected**或**private**之一,基類是先前定義的類的名稱。如果未使用訪問說明符,則預設為private。

考慮一個基類**Shape**及其派生類**Rectangle**,如下所示:

#include <iostream>
 
using namespace std;

// Base class
class Shape {
   public:
      void setWidth(int w) {
         width = w;
      }
      void setHeight(int h) {
         height = h;
      }
      
   protected:
      int width;
      int height;
};

// Derived class
class Rectangle: public Shape {
   public:
      int getArea() { 
         return (width * height); 
      }
};

int main(void) {
   Rectangle Rect;
 
   Rect.setWidth(5);
   Rect.setHeight(7);

   // Print the area of the object.
   cout << "Total area: " << Rect.getArea() << endl;

   return 0;
}

當編譯並執行上述程式碼時,它會產生以下結果:

Total area: 35

訪問控制和繼承

派生類可以訪問其基類的所有非私有成員。因此,基類中不應被派生類的成員函式訪問的成員應該在基類中宣告為私有。

我們可以根據誰能訪問它們來總結不同的訪問型別:

訪問 public protected private
同一類
派生類
外部類

派生類繼承所有基類方法,但以下情況除外:

  • 基類的建構函式、解構函式和複製建構函式。
  • 基類的過載運算子。
  • 基類的友元函式。

繼承型別

從基類派生類時,可以透過**public、protected**或**private**繼承繼承基類。繼承型別由訪問說明符指定,如上所述。

我們幾乎不使用**protected**或**private**繼承,但**public**繼承通常使用。在使用不同型別的繼承時,會應用以下規則:

  • **公共繼承** - 從**public**基類派生類時,基類的**public**成員成為派生類的**public**成員,基類的**protected**成員成為派生類的**protected**成員。基類的**private**成員永遠無法直接從派生類訪問,但可以透過呼叫基類的**public**和**protected**成員來訪問。

  • **受保護的繼承** - 從**protected**基類派生時,基類的**public**和**protected**成員成為派生類的**protected**成員。

  • **私有繼承** - 從**private**基類派生時,基類的**public**和**protected**成員成為派生類的**private**成員。

多重繼承

C++類可以使用多重繼承從多個類繼承成員。多重繼承是一個允許類從多個基類繼承的功能,這意味著派生類可以有多個父類,並繼承所有基類的屬性和行為。

以下是擴充套件的語法:

class derived-class: access baseA, access baseB....

其中訪問是**public、protected**或**private**之一,並且每個基類都會給出,它們將用逗號分隔,如上所示。讓我們嘗試以下示例:

#include <iostream>
 
using namespace std;

// Base class Shape
class Shape {
   public:
      void setWidth(int w) {
         width = w;
      }
      void setHeight(int h) {
         height = h;
      }
      
   protected:
      int width;
      int height;
};

// Base class PaintCost
class PaintCost {
   public:
      int getCost(int area) {
         return area * 70;
      }
};

// Derived class
class Rectangle: public Shape, public PaintCost {
   public:
      int getArea() {
         return (width * height); 
      }
};

int main(void) {
   Rectangle Rect;
   int area;
 
   Rect.setWidth(5);
   Rect.setHeight(7);

   area = Rect.getArea();
   
   // Print the area of the object.
   cout << "Total area: " << Rect.getArea() << endl;

   // Print the total cost of painting
   cout << "Total paint cost: $" << Rect.getCost(area) << endl;

   return 0;
}

當編譯並執行上述程式碼時,它會產生以下結果:

Total area: 35
Total paint cost: $2450
廣告