Итак, я знаю, что что-то вроде этого часто спрашивают, но другие ответы, похоже, указывают на то, что это должно работать, поэтому я решил спросить о своем коде специально.Я провожу больше времени в .NET и Java, поэтому, может быть, я что-то забываю.
Я создаю базовый виджет и набор конкретных виджетов (кнопок, других графических элементов).Я пытаюсь перебрать связанный список виджетов, и я хотел бы, чтобы конкретный метод рендеринга для этого конкретного виджета был вызван.Ниже приведен упрощенный код, демонстрирующий мою проблему: при первом вызове Render вызывается конкретная функция рендеринга.Если я передаю указатель cGeneralWidget функции, которая вызывает объект Render, вызывается базовый метод.Я думал, что пока я посылаю указатель, C ++ достаточно умен, чтобы знать, что на самом деле представляет собой объект, и вызывать переопределенный метод.
Иначе, как правильно обращаться с коллекцией базовых объектов и вызывать производные методы соответствующим образом?
Спасибо.
class cGeneralWidget
{
public:
void Render()
{
int a = 99;
}
};
class cSpecificWidget : public cGeneralWidget
{
public:
void Render()
{
int a = 99;
}
};
void GeneralRenderingFunction(cGeneralWidget * b)
{
b->Render(); // <-- calls the base function
}
int main(int argc, char* argv[])
{
cSpecificWidget wd;
wd.Render(); // <-- calls the derived function
GeneralRenderingFunction(&wd);
return 0;
}