Виртуальная функция не выполняется должным образом при вызове внутри обычной функции класса.C++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Виртуальная функция не выполняется должным образом при вызове внутри обычной функции класса.

Сообщение Anonymous »

Итак, у меня есть три таких класса:

Код: Выделить всё

class Events
{
protected:
virtual void __resizeChildren(float x, float y, float width, float height)
{

}

static void eventHandler(Event* evt, float x, float y, float width, float height)
{
evt->__resizeChildren(x,y,width,height);
// handles some events
}
};

class Window : public Events
{
protected:
virtual void __resizeChildren(float x, float y, float width, float height)
{
// resizes children
__internalOnMoveResize(); // after resizing, call an internal event function depending on the derived class type
}

virtual void __internalOnMoveResize()
{
// do something
}
};

class Scroll : public Window
{
protected:

virtual void __internalOnMoveResize()
{
// do something specific to objects of this class
}
}
Когда я создаю объект Scroll и Event::eventHandler обрабатывает исходящее от него событие, вызов evt ->__resizeChildren() преобразуется в вызов Window::__resizeChildren(), что является ожидаемым поведением.
Однако, когда __internalOnMoveResize() вызывается внутри Window::__resizeChildren(), фактически вызывается Window::__internalOnMoveResize(), а не Scroll::__internalOnMoveResize (), а это не то, чего я ожидал.
Я что-то упустил? Разве не следует вызывать Scroll::__internalOnMoveResize(), даже если он вызывается из метода класса Window, точно так же, как __resizeChildren()?
Я даже пытался передать текущий указатель объекта Window в статическую функцию и вызвал __internalOnMoveResize изнутри, точно так же, как и он происходит с eventHandler и __resizeChildren, но это тоже не сработало.
Пожалуйста, если нужна дополнительная информация, дайте мне знать чтобы я мог обновить этот пост.

Подробнее здесь: https://stackoverflow.com/questions/783 ... ss-functio
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»