Базовый метод C ++ вызывается вместо производного метода - PullRequest
0 голосов
/ 02 марта 2019

Итак, я знаю, что что-то вроде этого часто спрашивают, но другие ответы, похоже, указывают на то, что это должно работать, поэтому я решил спросить о своем коде специально.Я провожу больше времени в .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;
}

Ответы [ 2 ]

0 голосов
/ 02 марта 2019

Вы должны определить метод Render () в своем базовом классе с ключевым словом virtual и в своем производном классе с ключевым словом override.Если вы не добавите ключевое слово virtual в реализацию базового класса, C ++ не пометит его как виртуальное.

class cGeneralWidget
{
public:
    virtual void Render()
    {
        int a = 99;
    }
};

class cSpecificWidget : public cGeneralWidget
{
public:
    void Render() override
    {
        int a = 99;
    }
};
0 голосов
/ 02 марта 2019

в базовом классе

class cGeneralWidget
{
public:
    virtual void Render()
    {
        int a = 99;
    }
};

Визуализация должна быть виртуальной, поэтому она переопределяет ее

Примечание. Виртуальная функция - это функция-член, которая объявлена ​​в базовом классе и переопределена(Переопределено) производным классом.Когда вы ссылаетесь на объект производного класса, используя указатель или ссылку на базовый класс, вы можете вызвать виртуальную функцию для этого объекта и выполнить версию функции производного класса.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...