HOWTO · C++
C++ 繼承建構函式
關於 C++ 中的繼承以及我們如何繼承建構函式的完整程式設計教程。
本文是關於 C++ 中的繼承概念以及我們如何在派生類中繼承基類的建構函式。
C++ 中的繼承
在 C++ 中,特別是在物件導向程式設計中,最基本和最廣泛使用的概念是繼承。我們可以將一個類定義為另一個類的子類。
這也允許我們重用一些程式碼功能並減少我們的實現時間。它允許我們將基類的功能和屬性派生到派生類中。
- 基類——其屬性和功能被另一個類使用的類稱為基類。它有時也被稱為超類。
- 派生類——接受另一個類的屬性和功能的類稱為派生類。它有時也稱為子類。
考慮一些車輛的例子。Car、Bus 和 Truck 都是汽車,所有這些汽車都有一些共同的特點,也有一些不同的特點。
由於所有這些都是汽車,並且所有汽車都具有一些統一的功能。如果我們為所有這些汽車建立類,我們將做大量的程式碼重複。
如下圖所示。
從上圖中可以看出,所有汽車都具有相同的功能。這將建立三次重複的程式碼。
程式碼重複會產生許多其他問題,例如出錯的機會、增加的處理時間等。繼承用於克服這種情況。
我們可以建立一個包含所有這些功能的 Automobile 類,並使用該類派生其餘類。這樣,我們可以減少程式碼重複並提高程式碼的可重用性。
從上圖中可以看出,我們減少了重複程式碼,所有的功能都包含在了所有的類中。繼承通常定義 is-a 關係。
例如,汽車 is-a 汽車、圓形 is-a 形狀、狗 is-a 動物等。
C++ 中繼承的實現
我們需要遵循以下語法從基類派生子類。
class derived - class - name : access - specifier base - class - name { .. }
這個訪問說明符用於決定我們需要如何從基類繼承功能。我們是需要全部還是需要其中一些是根據訪問說明符決定的。
它可以是 public、private 或 protected。如果我們不指定訪問說明符,則預設為 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