亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

c ++虛擬繼承

c ++虛擬繼承

C++
PIPIONE 2019-07-27 14:18:53
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基類的特殊之處在于它們由最派生的類初始化,而不是由從虛擬基礎繼承的任何中間基類初始化。初始化一個堿基的正確選擇是哪個潛在的多個初始化器?

如果正在構造的派生類最多的類沒有在其成員初始化列表中列出它,則使用其默認構造函數初始化虛擬基類,該構造函數必須存在且可訪問。

請注意,允許在構造函數的初始化列表中使用虛擬基本標識符,即使它不是相關類的直接基礎。


查看完整回答
反對 回復 2019-07-27
?
收到一只叮咚

TA貢獻1821條經驗 獲得超5個贊

您需要從C顯式調用Base的構造函數:


class C : public A, public B {

public:

C(C* pParent) : Base(pParent), A(pParent), B(pParent) {}

/*... */

};


查看完整回答
反對 回復 2019-07-27
?
慕虎7371278

TA貢獻1802條經驗 獲得超4個贊

如果聲明自定義構造函數,則禁用默認構造函數。在虛擬繼承中,您需要直接調用虛擬繼承的構造函數,否則它將不知道是由A還是由B初始化。


查看完整回答
反對 回復 2019-07-27
  • 3 回答
  • 0 關注
  • 760 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號