Форум программистов, компьютерный форум CyberForum.ru

Вызов метода потомка через указатель на родителя - C++

Восстановить пароль Регистрация
 
antonboom
bmstu-team
 Аватар для antonboom
301 / 136 / 56
Регистрация: 10.01.2012
Сообщений: 419
Записей в блоге: 10
28.01.2016, 02:07     Вызов метода потомка через указатель на родителя #1
Всем доброго времени суток, никак не придумаю, как провернуть такое:
Пишу простенькую игру на cocos2dx.
Есть первый класс, CNode - он библиотечный, закрыт, в него ничего не можем добавлять, писать и прочее.
От него наследуется (и местами переопределяет родителя) класс CElement - описывающий общие характеристики элементов на игровом поле (различные клетки, поедаемые итемы, стены и пр). Не может быть абстрактным, нечистые виртуальные методы - пожалуйста.
От элемента наследуется большое количество классов, конкретно описывающие отдельные вещи.

Несколько элементов могут падать, но делают это все по-разному. Оперировать я могу с вектором СNode игрового поля.
Дискретно во времени мне нужно проверять может ли падать элемент и запускать это падение.
Как происходит сейчас, например
C++
1
2
3
4
5
6
7
8
9
10
/* Метод уровня, проверяющий возможность и запускающий падения элементов на нем */
void CLevel::checkFalldowns() {
    auto childs = getChildren();  // Получить вектор СNode уровня
    for (int i = 0; i < getChildrenCount(); i++) {  // Пройтись по нему в цикле
        CElement* child =  static_cast<CElement*>(childs.at(i)); // Приводим СNode к Элементу
        if (child->isStone()) // Если элемент камень
            static_cast<CStone*>(child)->startFallDown();  // Запускай у него метод падения и пр.
       // И так несколько условий на все падающие элементы ...
    }
}
Выглядит, очевидно, ужасно и я чувствую, что можно проще.
Хотелось бы, чтобы в цикле просто вызывали startFallDown у объекта СElement (по факту у одного и его потомков) и он сам смотрел, что за потомок его вызвал и использовал метод потомка.
Если делать startFallDown виртуальным, то вызовется метод СElement, а нужен метод потомка.
Делать его чисто виртуальным нельзя - структуре игры нужны объекты CElement в других местах (cocos2d решает).

Буду признателен за любую помощь, вопросы приветствуются.
Спасибо
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Kastaneda
Модератор
Эксперт С++
 Аватар для Kastaneda
4236 / 2769 / 218
Регистрация: 12.12.2009
Сообщений: 7,104
Записей в блоге: 1
Завершенные тесты: 1
28.01.2016, 08:10     Вызов метода потомка через указатель на родителя #2
Цитата Сообщение от antonboom Посмотреть сообщение
Если делать startFallDown виртуальным, то вызовется метод СElement, а нужен метод потомка.
Почему? Если в CElement добавить виртуальный метод, то все будет вызываться правильно.
Цитата Сообщение от antonboom Посмотреть сообщение
Хотелось бы, чтобы в цикле просто вызывали startFallDown у объекта СElement (по факту у одного и его потомков) и он сам смотрел, что за потомок его вызвал и использовал метод потомка.
Лучше добавить виртуальный метод bool canFall(), а потом уже вызывать startFallDown.

Добавлено через 1 минуту
или CElement тоже нельзя модифицировать?
antonboom
bmstu-team
 Аватар для antonboom
301 / 136 / 56
Регистрация: 10.01.2012
Сообщений: 419
Записей в блоге: 10
28.01.2016, 10:44  [ТС]     Вызов метода потомка через указатель на родителя #3
Kastaneda, CElement модифицировать можно. Сейчас в нем и есть как раз два виртуальных метода
C++
1
2
3
virtual bool canFallDown() { return false; }
virtual void startFallDown() { }
// у камня, к примеру, они переопределены и используют друг друга
Но мне казалось, что как раз вызывается эта пустая реализация у элемента. Да и с чего бы ему вызывать метод потомка, если мы привели к CElement, а у него есть этот виртуальный метод да и еще и реализованный?
В любом случае, проверю еще раз, отпишусь.
Спасибо
Kastaneda
Модератор
Эксперт С++
 Аватар для Kastaneda
4236 / 2769 / 218
Регистрация: 12.12.2009
Сообщений: 7,104
Записей в блоге: 1
Завершенные тесты: 1
28.01.2016, 10:45     Вызов метода потомка через указатель на родителя #4
Цитата Сообщение от antonboom Посмотреть сообщение
Да и с чего бы ему вызывать метод потомка, если мы привели к CElement, а у него есть этот виртуальный метод да и еще и реализованный?
Будет использовано позднее связывание и вызовется правильный метод. Попробуй еще раз.
Yandex
Объявления
28.01.2016, 10:45     Вызов метода потомка через указатель на родителя
Ответ Создать тему

Метки
cocos2d, виртуальная, классы, наследование, приведение типа
Опции темы

Текущее время: 15:23. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru