Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/131.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++多重继承_C++_Inheritance_Multiple Inheritance_Diamond Problem - Fatal编程技术网

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:这使得主管是一个经理,这对于任何实际的动态多态性使用都很重要。谢谢。花了我一点时间,因为我并没有意识到主管一开始也必须从员工那个里继承遗产!谢谢花了我一点时间,因为我并没有意识到主管一开始也必须从员工那个里继承遗产!当然,只有在无法重构菱形的情况下,才应该使用虚拟继承。在这里,主管对“雇员”的继承是完全多余的。当然,只有在无法重构菱形的情况下,才应该使用虚拟继承。在这里,主管对“员工”的继承是完全多余的。