首頁 > 後端開發 > C++ > C 中的虛擬繼承如何處理鑽石問題中的基底類別初始化?

C 中的虛擬繼承如何處理鑽石問題中的基底類別初始化?

Patricia Arquette
發布: 2024-12-19 22:18:11
原創
349 人瀏覽過

How Does Virtual Inheritance in C   Handle Base Class Initialization in Diamond Problems?

理解C 中的虛擬繼承

在處理複雜的繼承層次結構時,C 提供虛擬繼承作為解決菱形問題的機制,以下情況衍生類別透過多個路徑從同一基底類別繼承。但是,使用虛擬繼承有時會導致意外的編譯錯誤。

請考慮以下程式碼片段:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

class Base {

public:

  Base(Base* pParent);

  /* implements basic stuff */

};

 

class A : virtual public Base {

public:

  A(A* pParent) : Base(pParent) {}

  /* ... */

};

 

class B : virtual public Base {

public:

  B(B* pParent) : Base(pParent) {}

  /* ... */

};

 

class C : public A, public B {

public:

  C(C* pParent) : A(pParent), B(pParent) {} // - Compilation error here

  /* ... */

};

登入後複製

編譯此程式碼時,GCC 在指示的行報告錯誤。此錯誤源自於類別 C 沒有為 Base 提供初始化。虛擬基底類別僅由它們可見的最遠衍生類別初始化。在本例中,這將是類別 C。

在初始化期間不會呼叫 Base 的預設建構函數,因為虛擬基底類別永遠不會直接繼承。它必須透過初始化列表或透過將其指派給相同或派生類型的另一個物件來初始化。在這種情況下,類別 C 沒有為 Base 指定初始化,從而導致編譯錯誤。

要解決此問題,應修改程式碼以在類別 C 的建構子中包含對 Base 的明確初始化。可以透過將 C 建構函式替換為以下內容來實現:

1

2

3

4

5

class C : public A, public B {

public:

  C(C* pParent) : Base(pParent), A(pParent), B(pParent) {} // - Correct initialization here

  /* ... */

};

登入後複製

透過在類別 C 的建構函式中明確初始化 Base,編譯器現在可以正確處理虛擬繼承並成功編譯程式碼。

以上是C 中的虛擬繼承如何處理鑽石問題中的基底類別初始化?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板