1

ここで、このコードのワーカーの非常に奇妙な階層について質問しないでください。なぜ誰かがこのようなものを欲しがるのかわかりませんが、完全に理解していることを確認するために、多重継承の演習を行うことにしました。これが結果です。

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' の間のあいまいな変換」について何かを得ています。

4

4 に答える 4

6

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

解決策は、次のように仮想継承を使用することです(多重継承が必要であると仮定します):

class Manager : public virtual Employee 

virtualここでキーワードに注意してください。:-)

于 2012-05-04T19:23:28.303 に答える
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());
    }
};

この問題は、Diamond 継承の問題とも呼ばれます: http://en.wikipedia.org/wiki/Diamond_problem

于 2012-05-04T19:26:43.213 に答える
3

誰もが既に仮想継承について説明していますが、C++ FAQ も読むことをお勧めします。

http://www.parashift.com/c++-faq-lite/multiple-inheritance.html

于 2012-05-04T20:06:08.197 に答える
1

Supervisorタイプ Employee の 2 つのオブジェクト、直接のものと Manager 上のものを含みます。結果としてEmployeeメソッドを呼び出すのは曖昧です(どの従業員を呼び出す必要がありますか?)。代わりに、仮想多重継承を使用することをお勧めします。Supervisor

于 2012-05-04T19:23:05.247 に答える