2012-12-17 90 views
-4

因此,基於下面的評論,我想確認這個代碼是非法的,原因包括:多態性和純虛函數

  1. 我們已經創建了一個對象喬從抽象類員工
  2. 由於PrintCheck可()沒有定義,它使HourlyEmployee像Employee一樣是一個抽象類。因此,我們從抽象類中創建了對象joe。

class Employee 
{ 
public: 
    Employee(); 
    Employee(const string& theName, const string& theSsn); 
    string getName() const; 
    string getSsn() const; 
    double getNetPay() const; 
    void setName(const string& newName); 
    void setSsn(const string& newSsn); 
    void setNetPay(double newNetPay); 
    virtual void printCheck() const = 0; 
private: 
    string name; 
    string ssn; 
    double netPay; 
}; 


class HourlyEmployee : public Employee 
{ 
public: 
    HourlyEmployee(); 
    //<Some more legal member function definitions, none of which are 
    //pure virtual functions.> 
private: 
    double wageRate; 
    double hours; 
}; 


int main() 
{ 
    Employee joe; 
    joe = HourlyEmployee(); 
} 
+5

不,這是不合法的,它不會編譯。 – Angew

+1

唉!縮進! – StoryTeller

+0

@DimaRudnik更好嗎? – Angew

回答

2

什麼是非法的是:

員工是一個抽象基類。此行:

Employee joe; 

是非法的,它創建了一個抽象類的實例。

joe = HourlyEmployee(); 

是一個壞主意,即使這些類都是完整的,因爲它會切片。喬是一個對象,而不是一個參考。

如果HourlyEmployee仍然是抽象的(不實現printCheck()),那麼當然你的行是非法的,因爲你正在創建一個(臨時)實例。

順便提及,如果這兩個類是完全的,因此,代碼編譯,但是PrintCheck可()保持虛擬(未純),然後

joe.printCheck(); 

將調用僱員版本不是HourlyEmployee版本,因爲喬是Employee類型儘管分配仍然如此。這就是爲什麼切片大多是一個壞主意。

1

HourlyEmployee類需要實現基類的printCheck()函數。 一旦你實現了這個函數,HourlyEmployee是一個對象類。