C++ 中的多重繼承

Jinku Hu 2023年10月12日
  1. 使用多重繼承將兩個給定類的多個屬性應用於另一個類
  2. 使用 virtual 關鍵字修復基類的多個副本
C++ 中的多重繼承

本文將演示有關如何在 C++ 中使用多重繼承的多種方法。

使用多重繼承將兩個給定類的多個屬性應用於另一個類

C++ 中的類可以具有多個繼承,這提供了從多個直接基類派生一個類的可能性。
這意味著如果沒有仔細實現這些類,則可能會出現特殊的異常行為。例如,考慮以下程式碼段程式碼,其中 C 類是從 BA 類派生的。它們都有預設的建構函式,該建構函式輸出特殊的字串。雖然,當我們在 mainc 函式中宣告 C 型別的物件時,三個建構函式會列印輸出。請注意,建構函式以與繼承相同的順序被呼叫。另一方面,解構函式的呼叫順序相反。

#include <iostream>

using std::cin;
using std::cout;
using std::endl;
using std::string;

class A {
 public:
  A() { cout << "A's constructor called" << endl; }
};

class B {
 public:
  B() { cout << "B's constructor called" << endl; }
};

class C : public B, public A {
 public:
  C() { cout << "C's constructor called" << endl; }
};

int main() {
  C c;
  return 0;
}

輸出:

Bs constructor called
As constructor called
Cs constructor called

使用 virtual 關鍵字修復基類的多個副本

請注意,以下程式輸出 Planet 類建構函式的兩個例項,分別是 MarsEarth 建構函式,最後是 Rock 類建構函式。同樣,當物件超出範圍時,Planet 類的解構函式將被呼叫兩次。請注意,可以通過在 MarsEarth 類中新增 virtual 關鍵字來解決此問題。當一個類具有多個基類時,有可能派生
類將從其兩個或多個基類繼承具有相同名稱的成員。

#include <iostream>

using std::cin;
using std::cout;
using std::endl;
using std::string;

class Planet {
 public:
  Planet(int x) { cout << "Planet::Planet(int ) called" << endl; }
};

class Mars : public Planet {
 public:
  Mars(int x) : Planet(x) { cout << "Mars::Mars(int ) called" << endl; }
};

class Earth : public Planet {
 public:
  Earth(int x) : Planet(x) { cout << "Earth::Earth(int ) called" << endl; }
};

class Rock : public Mars, public Earth {
 public:
  Rock(int x) : Earth(x), Mars(x) { cout << "Rock::Rock(int ) called" << endl; }
};

int main() { Rock tmp(30); }

輸出:

Planet::Planet(int ) called
Mars::Mars(int ) called
Planet::Planet(int ) called
Earth::Earth(int ) called
Rock::Rock(int ) called
作者: Jinku Hu
Jinku Hu avatar Jinku Hu avatar

DelftStack.com 創辦人。Jinku 在機器人和汽車行業工作了8多年。他在自動測試、遠端測試及從耐久性測試中創建報告時磨練了自己的程式設計技能。他擁有電氣/ 電子工程背景,但他也擴展了自己的興趣到嵌入式電子、嵌入式程式設計以及前端和後端程式設計。

LinkedIn Facebook

相關文章 - C++ Class