Похоже, вы предоставили упрощенную версию своего кода, чтобы сделать его более читабельным, но вы случайно упростили его.
Наиболее вероятные причины вашего поведения:
- Нарезка на
FuncCaller()
(подробности см. В ответе Квамраны)
- Неправильное переопределение, например, создание функции производного класса
const
, в то время как функция базового класса не const
РЕДАКТИРОВАТЬ: После прочтения отредактированного вопроса, это явно вторая причина. Вы не переопределяете функцию базового класса, но скрываете ее в производных классах с новым определением. Вам необходимо сохранить точно такую же сигнатуру (ковариация здесь не применяется, так как функция возвращает void
) в производных классах. В коде вам нужно сделать либо:
class SomeParam;
class IBase
{
public:
virtual void Func(SomeParam* param = NULL)
{
cout << "Base func";
}
};
class DerivedA : public IBase
{
public:
void Func(SomeParam* param = NULL)
{
//do some custom stuff
cout << "DerivedA func";
IBase::Func();
}
};
class DerivedB : public IBase
{
public:
void Func(SomeParam* param = NULL)
{
//do some custom stuff
cout << "DerivedB func";
IBase::Func();
}
};
//at somewhere else
void FuncCaller(IBase *instance1, IBase *instance2)
{
IBase *i1 = instance1;
IBase *i2 = instance2;
i1->Func();
i2->Func();
}
DerivedA *a = new DerivedA;
DerivedB *b = new DerivedB;
FuncCaller(a,b);
или
class SomeParam;
class IBase
{
public:
virtual void Func()
{
cout << "Base func";
}
};
class DerivedA : public IBase
{
public:
void Func()
{
//do some custom stuff
cout << "DerivedA func";
IBase::Func();
}
};
class DerivedB : public IBase
{
public:
void Func()
{
//do some custom stuff
cout << "DerivedB func";
IBase::Func();
}
};
//at somewhere else
void FuncCaller(IBase *instance1, IBase *instance2)
{
IBase *i1 = instance1;
IBase *i2 = instance2;
i1->Func();
i2->Func();
}
DerivedA *a = new DerivedA;
DerivedB *b = new DerivedB;
FuncCaller(a,b);