请不要质疑这段代码中非常奇怪的工作者层次结构,我不知道为什么会有人想要这样的东西,但我决定给自己一个多重继承的练习,只是为了确保我完全理解了它。这就是结果。
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‘之间的模棱两可的转换”。那我该怎么办呢?
发布于 2012-05-05 03:23:28
实际上,按照您定义Supervisor类的方式,它的对象将有两个Employee类型的主题,每个主题都来自它的基类。这就是问题所在。
解决方案是使用virtual inheritance (假设需要多重继承),如下所示:
class Manager : public virtual Employee 希望你注意到这里的virtual关键字。:-)
发布于 2012-05-05 03:26:43
在这种情况下,您需要一个虚拟继承:
#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-05 04:06:08
每个人都已经介绍了虚拟继承,但我建议您也阅读C++常见问题解答。
http://www.parashift.com/c++-faq-lite/multiple-inheritance.html
https://stackoverflow.com/questions/10454874
复制相似问题