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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
antonboom
bmstu-team
 Аватар для antonboom
301 / 136 / 56
Регистрация: 10.01.2012
Сообщений: 419
Записей в блоге: 10
#1

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

28.01.2016, 02:07. Просмотров 267. Ответов 3

Всем доброго времени суток, никак не придумаю, как провернуть такое:
Пишу простенькую игру на 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 решает).

Буду признателен за любую помощь, вопросы приветствуются.
Спасибо
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
28.01.2016, 02:07     Вызов метода потомка через указатель на родителя
Посмотрите здесь:

C++ Вызов из потомка конструктор родителя
Почему не возвращается значение через указатель из метода класса? C++
Вызов метода базового класса из класса-потомка C++
вызов метода у указателя на указатель на класс C++
Вызов функции из массива, через указатель C++
C++ Возврат значения метода через указатель
C++ Вызов специфических для потомка функций, не зная класса потомка
C++ Вызов метода класса через указатель на ноль
Принудительный вызов метода родителя C++
Вызов метода производного класса через указатель на базовый класс C++
C++ Вызов метода родителя
C++ Вызов деструктора [удаление через указатель]

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Kastaneda
Форумчанин
Эксперт С++
 Аватар для Kastaneda
4252 / 2784 / 219
Регистрация: 12.12.2009
Сообщений: 7,109
Записей в блоге: 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
4252 / 2784 / 219
Регистрация: 12.12.2009
Сообщений: 7,109
Записей в блоге: 1
Завершенные тесты: 1
28.01.2016, 10:45     Вызов метода потомка через указатель на родителя #4
Цитата Сообщение от antonboom Посмотреть сообщение
Да и с чего бы ему вызывать метод потомка, если мы привели к CElement, а у него есть этот виртуальный метод да и еще и реализованный?
Будет использовано позднее связывание и вызовется правильный метод. Попробуй еще раз.
Yandex
Объявления
28.01.2016, 10:45     Вызов метода потомка через указатель на родителя
Ответ Создать тему
Опции темы

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