2013-04-03 57 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上调用虚拟功能,这两种类型可能有所不同。