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

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

虛繼承,為何報錯,說“Person::Person”: 沒有合適的默認構造函數可

虛繼承,為何報錯,說“Person::Person”: 沒有合適的默認構造函數可

C++
MOCKINGT 2017-08-22 23:28:11
#include <iostream>#include <stdlib.h>#include <string>using namespace std;/*** 定義人類: Person*/class Person{public:?? ?Person(string name) :m_strName(name)?? ?{?? ??? ?cout << "Person" << endl;?? ?}?? ?~Person()?? ?{?? ??? ?cout << "~Person" << endl;?? ?}?? ?void eat()?? ?{?? ??? ?cout << "eat" << endl;?? ?}protected:?? ?string m_strName;};class Worker : virtual public Person{public:?? ?Worker(string name):Person(name)?? ?{?? ??? ?cout << "Worker" << endl;?? ?}?? ?~Worker()?? ?{?? ??? ?cout << "~Worker" << endl;?? ?}?? ?void work()?? ?{?? ??? ?cout << "work" << endl;?? ?}};class Children : virtual public Person{public:?? ?Children(int age,string name):m_iAge(age),Person(name)?? ?{?? ??? ?cout << "Children" << endl;?? ?}?? ?~Children()?? ?{?? ??? ?cout << "~Children" << endl;?? ?}?? ?void play()?? ?{?? ??? ?cout << m_iAge << endl;?? ??? ?cout << "play" << endl;?? ?}protected:?? ?int m_iAge;};class ChildLabourer :public Worker,public Children{public:?? ?ChildLabourer(string name, int age) :Worker(name),Children(age,name)?? ?{?? ??? ?cout << "ChildLabourer" << endl;?? ?}?? ??? ?~ChildLabourer()?? ?{?? ??? ?cout << "~ChildLabourer" << endl;?? ?}};int main(void){?? ?// 用new關鍵字實例化童工類對象?? ?ChildLabourer *p = new ChildLabourer("jack",12);?? ??? ?// 調用童工類對象各方法。?? ?p->eat();?? ?p->work();?? ?p->play();?? ?delete p;?? ?p = NULL;?? ?system("pause");?? ?return 0;}
查看完整描述

3 回答

已采納
?
snowmanJS

TA貢獻89條經驗 獲得超53個贊

在childlabourer類的構造函數中的初始化列表中加上Person(name)就行了。

查看完整回答
3 反對 回復 2017-08-23
  • MOCKINGT
    MOCKINGT
    謝謝、可以告訴我為什么嗎?
  • snowmanJS
    snowmanJS
    因為Person類要先于其三個子類初始化,即其構造函數是最先執行的。又因為Person沒有默認構造函數,但有構造函數Person(string name),所以必須在childlabourer的初始化列表中加上Person (name)。
?
onemoo

TA貢獻883條經驗 獲得超454個贊

剛看到你采納了我在其他問題中的回答,就順手點進來了。

你采納的那個答案回答得很正確,我稍微進行一下補充:

一般來說,派生類只需要負責構造其直接基類,因為間接基類會由直接基類負責構造。但虛繼承下有些特殊:最后的派生類要負責構造虛基類(即便是間接虛基類)。或者說,虛基類的構造會優先于普通基類,所以必須由最后的派生類來負責先構造。

如若不然的話你想想會發生什么? ?多個被虛基類派生的直接基類會重復構造虛基類部分,為避免發生這種情況才有這個額外規則。


你的例子,雖然?Worker 和?Children 都會構造 Person,但由于 Person 是?ChildLabourer 的虛基類,所以?ChildLabourer 必須先顯式構造 Person。如果沒有顯式構造它,則會自動調用 Person 的默認構造函數。

查看完整回答
1 反對 回復 2017-09-16
?
天將明96

TA貢獻15條經驗 獲得超13個贊

因為童工類繼承工人類和兒童類,屬于多重繼承。所在Person類,Worker類,Children類的構造函數都要加上virtual,這樣才可以實現虛繼承!

查看完整回答
反對 回復 2017-08-23
點擊展開后面2
  • 3 回答
  • 0 關注
  • 2124 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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