2012-05-04 18 views
1

このコードでは、このコードでは本当に奇妙な階層の人物に疑問を呈していませんが、なぜ誰かがこのようなことを望む理由はわかりませんが、私は多重継承の練習を私はそれを完全に理解した。だからここに結果がある。C++多重継承

using namespace std; 

class Employee 
{ 
protected: 
    string name; 
public: 
    string getname() 
    { 
     return name; 
    } 
    void setname(string name2) 
    { 
     name = name2; 
    } 
    Employee(string name2) 
    { 
     name = name2; 
    } 
    Employee(){} 
}; 

class Manager : public Employee 
{ 
public: 
    string getname() 
    { 
     return ("Manager" + name); 
    } 
    Manager(string name2) : Employee(name2){} 
    Manager() : Employee(){} 
}; 

class Supervisor : public Manager,public Employee 
{ 
public: 
    Supervisor(string name2) : Manager(name2) , Employee(name2){} 
    Supervisor() : Manager() , Employee(){} 
    string getname() 
    { 
     return ("Supervisor" + Employee::getname()); 
    } 
}; 

私がここで何をしようとしているのか分かりましたらうれしく思います。派生クラス 'Supervisor'と基本クラス 'Employee'の間の "あいまいな変換"について何かを得ています。 "どうすればいいですか?

+1

「うまくいけば、私がここで何をしようとしている理解しています。」あなたは何をしようとしているのかを説明する方が良いかもしれません。 – thiton

+0

スーパーバイザがマネージャから継承するのはなぜですか? –

+0

@Justin:「管理者」は「従業員」から継承しているので、「管理者」は「マネージャ」だけでなく「従業員」から継承しているのですか? – ildjarn

答えて

6

実際には、Supervisorクラスを定義した方法で、そのオブジェクトには、それぞれが基本クラスから来るタイプEmployeeの2つのサブジェクトがあります。それは問題を引き起こしている。

ソリューションとしてvirtual inheritance(あなたは多重継承を必要とすると仮定)を使用することです:

class Manager : public virtual Employee 

はあなたがここにvirtualキーワードを注意して願っています。 :-)

+0

ダイヤモンドをリファクタリングすることができない場合、もちろん仮想継承を使用する必要があります。そしてここで、「監督者」による「従業員」の継承はまったく*余計です。 –

1

Supervisorには、従業員タイプの2つのオブジェクトが含まれています。直接的なものとマネージャーによるものです。結果的にメソッドをSupervisorに呼び出すことはあいまいです(従業員を呼び出す必要がありますか?)。仮想多重継承を代わりに使用することができます。

3

あなたはこのケースで仮想継承必要があります。この問題はまた、ダイヤモンド継承の問題として知られている

#include <iostream> 
#include <string> 
using namespace std; 

class Employee 
{ 
protected: 
    string name; 
public: 
    string getname() 
    { 
     return name; 
    } 
    void setname(string name2) 
    { 
     name = name2; 
    } 
    Employee(string name2) 
    { 
     name = name2; 
    } 
    Employee(){} 
}; 

class Manager : public virtual Employee 
{ 
public: 
    string getname() 
    { 
     return ("Manager" + name); 
    } 
    Manager(string name2) : Employee(name2){} 
    Manager() : Employee(){} 
}; 

class Supervisor : public Manager,public virtual Employee 
{ 
public: 
    Supervisor(string name2) : Manager(name2) , Employee(name2){} 
    Supervisor() : Manager() , Employee(){} 
    string getname() 
    { 
     return ("Supervisor" + Employee::getname()); 
    } 
}; 

を: http://en.wikipedia.org/wiki/Diamond_problem

+0

ありがとうございます。上司が最初に従業員から実質的に継承しなければならないことを気づかなかったので、ちょっと私を受けました! – Whovian