HOWTO · C++

C++ 繼承建構函式

關於 C++ 中的繼承以及我們如何繼承建構函式的完整程式設計教程。

本文是關於 C++ 中的繼承概念以及我們如何在派生類中繼承基類的建構函式。

C++ 中的繼承

在 C++ 中,特別是在物件導向程式設計中,最基本和最廣泛使用的概念是繼承。我們可以將一個類定義為另一個類的子類。

這也允許我們重用一些程式碼功能並減少我們的實現時間。它允許我們將基類的功能和屬性派生到派生類中。

  1. 基類——其屬性和功能被另一個類使用的類稱為基類。它有時也被稱為超類。
  2. 派生類——接受另一個類的屬性和功能的類稱為派生類。它有時也稱為子類。

考慮一些車輛的例子。Car、Bus 和 Truck 都是汽車,所有這些汽車都有一些共同的特點,也有一些不同的特點。

由於所有這些都是汽車,並且所有汽車都具有一些統一的功能。如果我們為所有這些汽車建立類,我們將做大量的程式碼重複。

如下圖所示。

遺產

從上圖中可以看出,所有汽車都具有相同的功能。這將建立三次重複的程式碼。

程式碼重複會產生許多其他問題,例如出錯的機會、增加的處理時間等。繼承用於克服這種情況。

我們可以建立一個包含所有這些功能的 Automobile 類,並使用該類派生其餘類。這樣,我們可以減少程式碼重複並提高程式碼的可重用性。

繼承解決方案

從上圖中可以看出,我們減少了重複程式碼,所有的功能都包含在了所有的類中。繼承通常定義 is-a 關係。

例如,汽車 is-a 汽車、圓形 is-a 形狀、狗 is-a 動物等。

C++ 中繼承的實現

我們需要遵循以下語法從基類派生子類。

class derived - class - name : access - specifier base - class - name { .. }

這個訪問說明符用於決定我們需要如何從基類繼承功能。我們是需要全部還是需要其中一些是根據訪問說明符決定的。

它可以是 publicprivateprotected。如果我們不指定訪問說明符,則預設為 private

例子:

public
class Automobile {
 public:
  getFuelAmount();
  applyBrakes();
  startEngine();
  stopEngine();
} public class Car : public Automobile {
  pressHorn();
} public class Bus : public Automobile {
  pressHorn();
}

從上面的程式碼可以看出,兩個派生類只有一個函式,兩者並不統一,因為所有車輛的喇叭聲音都不一樣。因此,我們在派生類中製作了該函式,其餘的在基類中。

考慮 Shapes 類的另一個示例。

#include <iostream>
#include <string>
using namespace std;
class Shapes {
 public:
  int w;
  int h;
};
class Square : public Shapes {
 public:
  int getArea() { return w * h; }
};
int main() {
  Square s;
  s.w = 5;
  s.h = 5;
  cout << "Area: " << s.getArea() << endl;
  return 0;
}

輸出:

Area: 25

C++ 中的建構函式繼承

我們可以從前面的示例中看到,函式和屬性在派生類中繼承自基類。但是如果我們需要呼叫基類的建構函式,那麼我們需要在派生類的建構函式中顯式呼叫它。

建構函式不會自動呼叫。考慮下面的一個例子。

#include <iostream>
using namespace std;
class baseClass {
 public:
  baseClass() { cout << "In constructor: Base" << endl; }
};
class derivedClass : public baseClass {
 public:
  derivedClass() : baseClass() { cout << "In Constructor: derived" << endl; }
};
int main() {
  derivedClass d;
  cout << "In main" << endl;
}

輸出:

In constructor: Base
In Constructor: derived
In main

在 C++11 中,這可以使用 using-declaration 來完成。通過 using-declaration,我們可以在基類中使用派生類函式。

上面的例子可以修改如下。

#include <iostream>
using namespace std;
class baseClass {
 public:
  baseClass() { cout << "In constructor: Base" << endl; }
};
class derivedClass : public baseClass {
  using baseClass::baseClass;

 public:
  derivedClass() { cout << "In Constructor: derived" << endl; }
};
int main() {
  derivedClass d;
  cout << "In main" << endl;
}

它也將產生相同的輸出。

In constructor: Base
In Constructor: derived
In main