C++ 繼承建構函式

Muhammad Husnain 2023年1月30日 2022年6月15日
  1. C++ 中的繼承
  2. C++ 中繼承的實現
  3. 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
Muhammad Husnain avatar Muhammad Husnain avatar

Husnain is a professional Software Engineer and a researcher who loves to learn, build, write, and teach. Having worked various jobs in the IT industry, he especially enjoys finding ways to express complex ideas in simple ways through his content. In his free time, Husnain unwinds by thinking about tech fiction to solve problems around him.

LinkedIn