[英]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.