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

多类继承?
EN

Stack Overflow用户
提问于 2011-12-01 19:20:42
回答 3查看 1.7K关注 0票数 2

根据下图,我编写了我的代码。

这是我写的代码:

代码语言:javascript
复制
#include<iostream>
#include<string>
using namespace std;

class person
{
private:
    int code;
    string name;
public:
    void    setCode(int c) { code=c; }
    int getCode()          { return code; }
    void setName(string s) { name=s; }
    string getName()       { return name; }
};

class account : public person
{
private:
    double pay;
public:
    void    setPay(double p) { pay=p; }
    double getPay()          { return pay; }
};

class admin : public person
{
private:
    string experience;
public:
    void setExper(string e) { experience=e; }
    string getExper()       { return experience; }
};

class master : public account, public admin
{
};

int main()
{
    master mastObj;// create master object.
    mastObj.setName("John");
    system("pause");//to pause console screen, remove it if u r in linux
    return 0;
}

编译器显示了以下错误:

代码语言:javascript
复制
Error   1   error C2385: ambiguous access of 'setName'
Error   2   error C3861: 'setName': identifier not found    
Error   3   IntelliSense: "master::setName" is ambiguous
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-12-01 19:22:53

你需要虚拟继承:

代码语言:javascript
复制
class account: public virtual person{
....
}

class admin: public virtual  person{
...
}

PS和您的支付、代码字段缺少初始化!这可能会导致令人难堪的错误(比如向清洁工支付数百万美元:):

代码语言:javascript
复制
#include<iostream>
#include<string>
using namespace std;

class person
{
   // ...
   person() : code(0), name("anonymous") {}

};

class account : public virtual person
{
    // ...
    account() : pay(0) {}
};

class admin : public virtual person
{
    // ...
    admin() : experience("unknown") {}
};
票数 3
EN

Stack Overflow用户

发布于 2011-12-01 19:22:46

当您使用多重继承时,这是C++中Diamond Problem的经典示例。

解决方案是:Virtual inheritance

也就是说,您应该这样做:

代码语言:javascript
复制
class account : public virtual person 
{                   //^^^^^^^note this
   //code
};

class admin : public virtual  person
{                  //^^^^^^^note this
   //code
};

我刚刚在这个网站上找到了非常好的帖子,所以我会把你重定向到这里的答案:

这也意味着,这个话题应该投票关闭。

票数 7
EN

Stack Overflow用户

发布于 2020-09-08 19:56:38

您可以使用mastObj.master::admin::person::setName("John");

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

https://stackoverflow.com/questions/8340516

复制
相关文章

相似问题

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