2016-12-14 36 views
0

我試圖使用多繼承。 是我的基礎班。 學生Angestellter繼承受保護的屬性。 WissenschaftlicheHilfskraft也應該繼承這些屬性(來自Person,Student,Angestellter),但我無法在最後一個派生類中調用方法get_name()。爲什麼?在C++中使用3個派生類的多繼承

#include <iostream> 

using namespace std; 

class Person { 
     protected: 
       string name; 
     public:    //....... 
      string get_name() { name = "bob"; return name; } 
}; 

class Student: public Person { 
private: //...... 
public:  //...... 
}; 

class Angestellte: public Person { 
private: //...... 
public: //...... 
}; 

class WissenschaftlicheHilfskraft : public Student, public Angestellte 
{ 
private: //...... 
public: //...... 
}; 


int main() 
{ 
    Person p; 
    cout << p.get_name() << endl; //WORKS 
    Student s; 
    cout << s.get_name() << endl; //WORKS 
    Angestellte a; 
    cout << a.get_name() << endl; //WORKS 
    WissenschaftlicheHilfskraft wh; 
    cout << wh.get_name() << endl; //DOESN'T WORK 
    return 0; 
} 

我希望它看起來像這樣: enter image description here

+0

你可以在這裏熟悉:https://isocpp.org/wiki/faq/multiple-inheritance – Sambuca

回答

2

此外,除了保羅R的答案你的繼承是錯誤的。您需要使用虛擬繼承,如圖所示here

class Student: public Person {變成class Student: public virtual Person {等等。這確保了僅爲最終對象創建一個基礎對象。

+2

這是比我的更好的答案,因爲它解決了潛在的問題,而不是工作周圍。 –

+0

謝謝你們倆:) – Rudi

2

這是典型的「鑽石」問題與多重繼承。您可以通過消除模糊性來解決此問題,例如改變:

cout << wh.get_name() << endl; //DOESN'T WORK 

到:

cout << wh.Student::get_name() << endl; //WORKS 

然而,看到@Shiv's answer一個更好的解決方案,它正確解析潛在的問題。

+0

感謝您的幫助:) – Rudi