首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C++多重继承

C++多重继承
EN

Stack Overflow用户
提问于 2012-05-05 03:18:41
回答 4查看 2K关注 0票数 1

请不要质疑这段代码中非常奇怪的工作者层次结构,我不知道为什么会有人想要这样的东西,但我决定给自己一个多重继承的练习,只是为了确保我完全理解了它。这就是结果。

代码语言:javascript
复制
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‘之间的模棱两可的转换”。那我该怎么办呢?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2012-05-05 03:23:28

实际上,按照您定义Supervisor类的方式,它的对象将有两个Employee类型的主题,每个主题都来自它的基类。这就是问题所在。

解决方案是使用virtual inheritance (假设需要多重继承),如下所示:

代码语言:javascript
复制
class Manager : public virtual Employee 

希望你注意到这里的virtual关键字。:-)

票数 6
EN

Stack Overflow用户

发布于 2012-05-05 03:26:43

在这种情况下,您需要一个虚拟继承:

代码语言:javascript
复制
#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

票数 3
EN

Stack Overflow用户

发布于 2012-05-05 04:06:08

每个人都已经介绍了虚拟继承,但我建议您也阅读C++常见问题解答。

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

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10454874

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档