C ++多重继承(C++ multiple inheritance)

2019-09-17 01:19发布

请不要质疑工人的真正奇怪的层次结构,这个代码在这里,我不知道为什么会有人想是这样的,但我决定给自己在多重继承的锻炼,只是要确定我完全理解它。 因此,这里的结果。

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());
    }
};

希望你理解我想要在这里做。 我收到一些关于一个“派生类‘监’和基类的员工。“暧昧之间的转换”所以,我该怎么办?

Answer 1:

其实,你所定义的方式Supervisor类,它的对象有型的二级学科Employee ,分别来自其基类的到来。 这是造成问题。

该解决方案是使用虚拟继承 (假设你需要多重继承)为:

class Manager : public virtual Employee 

希望大家注意, virtual这里的关键字。 :-)



Answer 2:

每个人都已经覆盖了虚拟继承,但我建议你阅读C ++常见问题为好。

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



Answer 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



Answer 4:

Supervisor包含Employee类型的两个对象,直接一个和一个过经理。 它是暧昧叫Employee在方法Supervisor在后果( 其中员工应该叫什么名字?)。 您可能需要使用虚拟多重继承来代替。



文章来源: C++ multiple inheritance