2015-11-05 63 views
2

我檢查了類繼承的語法,我很確定我沒有錯誤?有什麼東西從我身上溜走?類繼承代碼不起作用

class person 
{ 
public: 
int personid; 
string personname; 
string personadress; 
person(int apersonid, string apersonname, string apersonadress)//constructor 
{ 
    personid=apersonid; 
    personname=apersonname; 
    personadress=apersonadress; 
} 
int getpersonid() 
{ 
    return personid; 
} 
string getpersonname() 
{ 
    return personname; 
} 
string getpersonadress() 
{ 
    return personadress; 
} 
}; 

class employee: public person 
{ 
public: 
int commission; 
employee(int _commission, int apersonid, string apersonname, string apersonaddress) : person(apersonid, apersonname, apersonaddress) 
{ 
    commission= _commission; 
} 
int getcommission() 
{ 
    return commission; 
    } 
}; 

我得到的錯誤是

錯誤1錯誤C2512: '人':沒有適當的默認構造函數 可用

+0

構造函數上的不同簽名。在其他語言中,繼承類隱式地使用相同的簽名調用基類的構造函數。所以我會建議使用相同的參數編寫一個構造函數,或者顯式地調用基礎構造函數。只是猜測,因爲我不知道你在用什麼語言。 –

+0

使用的語言是C++ .. –

+2

[使用初始化列表](http://makecleanandmake.com/2014/10/31/c-anitpatterns-the-java-constructor-and-final-vs-const/) –

回答

2

我懷疑你的問題是你的基類沒有定義一個默認的構造函數(帶有0個參數)。相反,你有一個具有多個參數的構造函數。

person(int apersonid, string apersonname, string apersonadress)//constructor 
{ 
    personid=apersonid; 
    personname=apersonname; 
    personadress=apersonadress; 
} 

你的員工類從人繼承,但它的構造函數只需要一個參數,並使用它的構造函數不初始化基類。

employee(int _commission) 
{ 
    commission= _commission; 
} 

這是一個問題b/c當你創建一個僱員的實例,它也試圖調用person類的構造函數。由於您沒有默認構造函數(再次,沒有參數),您將需要在僱員構造函數中顯式調用person構造函數。

您有兩種選擇。

首先,修改人的構造函數沒有參數

person() 

如果使用這種方法,你對你的員工類簽名不會有改變。

也可以修改員工的構造採取所有參數的構造函數的人預計:

class employee: public person 
{ 
    public: 
    int commission; 

    employee(int _commision, int apersonid, string apersonname, string apersonadress) : person(apersonId, apersonname, apersonadress) 
    { 
     commission = _commission; 
    } 
    int getcommission() 
    { 
     return commission; 
    } 
}; 

在構造函數中,冒號(之後的代碼:)是用論據的人構造函數的調用指定(apersonid,apersonname,apersonadress)。

然後員工構造函數會分配_commission的值,因爲它的作用域僅在僱員類中相關。

這有道理嗎?

+0

,但我認爲當y繼承x時,它需要它的方法。所以不需要在y中提及它們...所以如果我將參數移動到y,那麼不需要使用繼承。 可以嗎?請告訴我第一個選項將如何執行? –

+1

它確實繼承了這些方法。它繼承了構造函數。但是,如果您只使用一個參數在員工身上定義構造函數,那麼您如何在施工過程中創建一個可以獲得人員需要構建的所有信息的員工。現在,要創建一名員工,您可以給員工打電話(2500)。但是人員類仍然需要一個ID,姓名,地址。它在哪裏得到的信息 –

+0

呃試圖解決它,但沒有任何工作......不知道如果我問很多...但你能寫出修復? –

1

在C++中,如果構造函數明確的定義一個類,但它們都是非默認的,編譯器不會隱式地定義一個默認構造函數,導致類沒有默認構造函數的情況。你已經在你的類定義的非默認的構造函數,這一個:

person(int apersonid, string apersonname, string apersonadress) 

所以你需要自己定義一個默認構造函數。例如。

person() {} 

請記住,在這種情況下,當你構建employee類的一個對象的person默認構造函數被調用。如果不需要,您需要在構造函數employee中調用person的非默認構造函數。