2012-01-23 54 views
1

我有兩個類都擴展了一個父類。我想寫一個可以接受任何一個類但調用childs函數的函數。一個函數,它接受兩個子類之一併調用它們的相同函數

即:

class employee 
{ 
public: 
    employee(); 
    virtual ~employee(); 
    int wage; 
    int hours; 
    virtual int calculatePay() =0; 

}; 

class factoryWorker : public employee 
{ 
    public: 
     factoryWorker(); 
     int calculatePay(); 
}; 

class manager : public employee 
{ 
    public: 
     manager(); 
     int calculatePay(); 
}; 
在main.cpp的文件

我有一個函數

int getPay(employee anyTypeOfWorker) { 
    return anyTypeOfWorker.calculatePay(); 
} 

但這個函數總是調用父(員工)calculatePay()函數沒有被覆蓋的功能。

謝謝。

+0

查找虛擬關鍵字 –

+1

您的main.cpp無法編譯,因爲'employee'是抽象的。 –

+0

注意:您不應該按值傳遞'employee'實例;你會得到[object slicing](http://en.wikipedia.org/wiki/Object_slicing)。 – ruakh

回答

1

通過地址。

int getPay(employee* anyTypeOfWorker) { 
    return anyTypeOfWorker->calculatePay(); 
} 
+0

謝謝,這工作完美。 – user1165379

1

如果參數是引用或指向基類的指針,它就可以工作。

int getPay(employee& anyTypeOfWorker) { 
    return anyTypeOfWorker.calculatePay(); 
} 

如果按值傳遞,參數將被「切片」爲聲明的參數類型。

+0

謝謝,這工作完美 – user1165379

1

那麼,你實際上不能撥打employee::calculatePay(),因爲它是純虛擬的,但是你的代碼是嘗試爲在對象被複制到getPay()的棧幀的過程中被「切片」到employee

您需要傳遞指針或引用,以便getPay()可以訪問調用者的實際factoryworkermanager對象。例如:

int getPay(employee const &anyTypeOfWorker) { 
    return anyTypeOfWorker.calculatePay(); 
} 
+0

如果通過const引用傳遞參數,則不能調用非const成員函數。 –

+0

糟糕,你是對的,我忽略了這一點。 'calculatePay()'應該被聲明爲const。 – Wyzard

+0

謝謝,這工作完美 – user1165379

相關問題