#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 回答

onemoo
TA貢獻883條經驗 獲得超454個贊
剛看到你采納了我在其他問題中的回答,就順手點進來了。
你采納的那個答案回答得很正確,我稍微進行一下補充:
一般來說,派生類只需要負責構造其直接基類,因為間接基類會由直接基類負責構造。但虛繼承下有些特殊:最后的派生類要負責構造虛基類(即便是間接虛基類)。或者說,虛基類的構造會優先于普通基類,所以必須由最后的派生類來負責先構造。
如若不然的話你想想會發生什么? ?多個被虛基類派生的直接基類會重復構造虛基類部分,為避免發生這種情況才有這個額外規則。
你的例子,雖然?Worker 和?Children 都會構造 Person,但由于 Person 是?ChildLabourer 的虛基類,所以?ChildLabourer 必須先顯式構造 Person。如果沒有顯式構造它,則會自動調用 Person 的默認構造函數。

天將明96
TA貢獻15條經驗 獲得超13個贊
因為童工類繼承工人類和兒童類,屬于多重繼承。所在Person類,Worker類,Children類的構造函數都要加上virtual,這樣才可以實現虛繼承!
點擊展開后面2條
- 3 回答
- 0 關注
- 2124 瀏覽
添加回答
舉報
0/150
提交
取消