c ++虛擬繼承問題: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抱怨它無法匹配函數調用Base(),即默認構造函數。但是C不直接從Base繼承,只通過A和B.那么為什么gcc會在這里抱怨?想法?TIA / Rob
3 回答

波斯汪
TA貢獻1811條經驗 獲得超4個贊
virtual
基類的特殊之處在于它們由最派生的類初始化,而不是由從虛擬基礎繼承的任何中間基類初始化。初始化一個堿基的正確選擇是哪個潛在的多個初始化器?
如果正在構造的派生類最多的類沒有在其成員初始化列表中列出它,則使用其默認構造函數初始化虛擬基類,該構造函數必須存在且可訪問。
請注意,允許在構造函數的初始化列表中使用虛擬基本標識符,即使它不是相關類的直接基礎。

收到一只叮咚
TA貢獻1821條經驗 獲得超5個贊
您需要從C顯式調用Base的構造函數:
class C : public A, public B {
public:
C(C* pParent) : Base(pParent), A(pParent), B(pParent) {}
/*... */
};
- 3 回答
- 0 關注
- 760 瀏覽
添加回答
舉報
0/150
提交
取消