2016-12-14 16 views
0

私は多重継承を使用しようとしています。 は私の基本クラスです。 生徒およびAngestellterは保護された属性を継承します。 WissenschaftlicheHilfskraftも(Person、Student、Angestellterから)これらの属性を継承する必要がありますが、最後の派生クラスでget_name()メソッドを呼び出すことはできません。どうして?3つの派生クラスを持つC++の多重継承

#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

また、Paul Rの回答以外に、あなたの遺産は間違っています。図のように仮想継承を使用する必要があります。here

class Student: public Person {class Student: public virtual Person {となります。これにより、最終オブジェクトに対してベースのオブジェクトが1つだけ作成されます。

+2

これは仕事よりむしろ根本的な問題を解決するので、私よりも良い答えです。その周りに。 –

+0

ありがとうございます:) – Rudi

2

これは多重継承を持つ古典的な「ダイヤモンド」の問題です。あいまいさを取り除くことで、この問題を回避することができます。変更:へ

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

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

しかし、適切に根本的な問題を解決し、より良いソリューションを@Shiv's answerを参照してください。

+0

助けてくれてありがとうございます。 – Rudi

関連する問題