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类的方式,它的对象将有两个类型的主题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());
    }
};

这个问题也被称为钻石继承问题: 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 类型的两个对象,直接对象和经理对象。在结果Employee上调用方法是模棱两可的(应该调用哪个Employee?)。您可能想改用虚拟多重继承。Supervisor

于 2012-05-04T19:23:05.247 回答