簡體   English   中英

如何在虛擬繼承下游使用參數化基類構造函數

[英]How to use parameterized base class constructor downstream of virtual inheritance

我有一個類似於以下的類結構:

  O
  |
  A
 / \
B   C
 \ /
  D
  |
  E

構造函數的工作方式如下(為簡潔起見,不包含特定代碼,但如果需要,我可以更多地將其充實):

class O {
  protected:
    O(const string &str) {
      //Does stuff with str
    };
}

class A : public O {
  protected:
    A(const string &str) : O(str) { };
}

class B : public virtual A {
  protected:
    B(const string &str) : A(str) { };
}

class C : public virtual A {
  protected:
    C(const string &str) : A(str) { };
}

class D : public B, public C {
  protected:
    D(const string &str) : B(str), C(str) { };
}

class E : public D {
  public:
    E(const string &str) : D(str) { };
}

類O,A,B,C和D應該是庫的一部分,其中類D是我稍后創建的任何類的基類(例如E)。 D的唯一目的是簡化像E這樣的類的繼承。我的問題是E的構造函數調用A的默認構造函數,除非我顯式調用A的參數化構造函數,這違背了D的目的。

這種繼承結構最適合我的應用程序,因為C&D類正用於專門化A和B創建的基礎結構.C包含A的其他方法。

有沒有辦法讓D處理對A參數化構造函數的調用? 理想情況下,我想初始化E以按順序調用構造函數A,B,C,D,E。 字符串參數對於O的上游類非常重要,構造函數B和C需要運行特定的函數。

不可以。虛擬基類必須始終由派生程度最高的類構造。 它不能以任何其他方式工作。 您所能做的就是不允許A默認構造,並讓編譯器幫助您,或者重構您的代碼,以便首先不使用鑽石繼承。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM