Виртуальная функция производного класса вызывает функцию базового класса - PullRequest
0 голосов
/ 10 июля 2020
#include <iostream>
using namespace std;
class Widget {
public:
    int width;
    virtual void resize() { width = 10; }
};
class SpeWidget :public Widget {
public:
    int height;
    void resize() override {
        //Widget::resize();
        Widget* th = static_cast<Widget*>(this);
        th->resize();
        height = 11;
    }
};
int main() {
    //Widget* w = new Widget;
    //w->resize();
    //std::cout << w->width << std::endl;
    SpeWidget* s = new SpeWidget;
    s->resize();
    std::cout << s->height << "," << s->width << std::endl;
    std::cin.get();
}

Виртуальная функция производного класса (SpeWidget) (resize ()) хочет вызвать это в базовом классе (Widget). Почему в приведенном выше коде есть ошибка сегмента. Спасибо!

1 Ответ

1 голос
/ 10 июля 2020

Закомментированный код правильный.

Widget::resize();

Ваш заменяющий код неверен.

Widget* th = static_cast<Widget*>(this);
th->resize();

Подумайте об этом: вы вызываете виртуальную функцию через указатель на базовый класс . Что произойдет, если вы сделаете это с любой виртуальной функцией? Называется самая производная версия. Другими словами, бесконечная рекурсия.

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