2013-04-03 98 views
0

我有父類「Entry」,它有兩個childern,Income和Expense。我想能夠有這樣的功能:將父對象的引用傳遞給想要子對象的函數

bool SomeObject::removeEntry(Entry& item, list<Entry> *l) 
{ 
    if (l==&incomeHis) 
     return removeIncome(item); 
    if (l==&expHis) 
     return removeExp(item); 
} 

這可能嗎?函數removeExp()需要類Expense的對象。由於我通過引用傳遞它,我知道它應該沒問題,但編譯器不同意。

+0

你真的是指父母和孩子,或者是從基類派生的那兩個?這是一個區別。 – nvoigt

+2

您可以將派生類傳遞給期望基類的函數,但不能反過來。 –

+2

您可以通過使用'dynamic_cast '來實現這一點 - 但它看起來非常像一個糟糕的設計決定。你需要什麼樣的功能?我希望它不是'std :: list '因爲那時它不包含收入和費用。 –

回答

1

編譯器是正確的,因爲它不能確保該行上的每個Entry碰巧是一個Expense

你已經自己設計成一個角落,可以這麼說。

更好的設計是讓SomeObject::removeEntry直接執行removeIncomeremoveExp共有的任何邏輯。如果邏輯不同,請在item上調用虛擬功能,這兩種類型可能有所不同。