C++多重继承
请不要质疑这段代码中真正奇怪的工作者层次结构,我不知道为什么会有人想要这样的东西,但我决定让自己练习多重继承,只是为了确保我完全理解它。结果是这样的C++多重继承,c++,inheritance,multiple-inheritance,diamond-problem,C++,Inheritance,Multiple Inheritance,Diamond Problem,请不要质疑这段代码中真正奇怪的工作者层次结构,我不知道为什么会有人想要这样的东西,但我决定让自己练习多重继承,只是为了确保我完全理解它。结果是这样的 using namespace std; class Employee { protected: string name; public: string getname() { return name; } void setname(string name2) { n
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”之间的模糊转换的信息。那么我该怎么办呢?Supervisor包含两个Employee类型的对象,一个是direct对象,另一个是Manager对象。在主管身上调用Employee方法是不明确的,因此应该调用哪个员工?。您可能希望使用虚拟多重继承。Supervisor包含两个Employee类型的对象,一个是direct对象,另一个是over Manager对象。在主管身上调用Employee方法是不明确的,因此应该调用哪个员工?。您可能希望使用虚拟多重继承。实际上,按照您定义Supervisor类的方式,它的对象将有两个Employee类型的主题,每个主题都来自它的基类。这是造成问题的原因 解决方案是假设您需要多重继承:
class Manager : public virtual Employee
希望您注意此处的虚拟关键字:- 实际上,按照您定义Supervisor类的方式,它的对象将有两个Employee类型的主题,每个主题都来自它的基类。这是造成问题的原因 解决方案是假设您需要多重继承:
class Manager : public virtual Employee
希望您注意此处的虚拟关键字:- 在这种情况下,您需要虚拟继承:
#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());
}
};
此问题也称为菱形继承问题:
在这种情况下,您需要虚拟继承:
#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());
}
};
此问题也称为菱形继承问题:
每个人都已经涉及过虚拟继承,但我也建议阅读C++常见问题解答。
每个人都已经涉及过虚拟继承,但我也建议阅读C++常见问题解答。
希望你明白我在这里要做什么。你最好解释一下你想做什么。为什么主管是从经理那里继承来的?@Justin:更贴切的问题是,既然经理是从员工那里继承来的,为什么主管是从员工而不仅仅是经理那里继承来的?我在这里看不到任何实际问题?@Justin:这使得主管是一个经理,这对于任何实际的动态多态性使用都很重要。希望您理解我在这里要做的事情。你最好解释一下你想做什么。为什么主管是从经理那里继承来的?@Justin:更贴切的问题是,既然经理是从员工那里继承来的,为什么主管是从员工而不仅仅是经理那里继承来的?我在这里看不到任何实际问题?@Justin:这使得主管是一个经理,这对于任何实际的动态多态性使用都很重要。谢谢。花了我一点时间,因为我并没有意识到主管一开始也必须从员工那个里继承遗产!谢谢花了我一点时间,因为我并没有意识到主管一开始也必须从员工那个里继承遗产!当然,只有在无法重构菱形的情况下,才应该使用虚拟继承。在这里,主管对“雇员”的继承是完全多余的。当然,只有在无法重构菱形的情况下,才应该使用虚拟继承。在这里,主管对“员工”的继承是完全多余的。