2011-12-01 235 views
2

根據下圖,我寫了我的代碼。 enter image description here多類繼承?

這是我寫的代碼:

#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; 
} 

編譯器顯示這些錯誤:

Error 1 error C2385: ambiguous access of 'setName' 
Error 2 error C3861: 'setName': identifier not found  
Error 3 IntelliSense: "master::setName" is ambiguous 
+0

首先,你的問題的標題是不是一個實際的問題,無論是問號在句末。其次,最好實際描述一個問題,解釋你到目前爲止所嘗試的內容,而不是僅僅粘貼一段代碼,並讓其他人修復它。 –

+0

你的代碼格式有點亂。代碼也適用於人類:)特別是因爲你想_us_閱讀它。 – sehe

+0

[虛擬繼承混亂]的可能重複(http://stackoverflow.com/questions/8148470/virtual-inheritance-confusion) – Nawaz

回答

3

你需要虛擬繼承:

class account: public virtual person{ 
.... 
} 

class admin: public virtual person{ 
... 
} 

PS而你的付出,代碼領域缺乏初始化!這可能導致尷尬的錯誤(如支付的數百萬美元:)清潔劑):

#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") {} 
}; 
7

它是用C++ Diamond Problem當您使用多重繼承經典的例子。

解決的辦法是:Virtual inheritance

也就是說,你應該這樣做:

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

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

我才發現真的很不錯的職位上這個網站,所以我會重定向到這裏這些問題的答案:

這也意味着,這個話題應該投票支持密切。