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

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

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

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

28.01.2016, 02:07. Просмотров 324. Ответов 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++
Как на с++ вызывается конструктор-родителя от конструктора-потомка. На яве так работает: package u; class A{ private int a,b,c;...

Вызов метода класса через указатель на ноль - C++
Почему в таком коде не происходит ошибка при вызове метода класса, а уже только в самом методе: struct A { int a; void...

Вызов метода производного класса через указатель на базовый класс - C++
Всем привет ! Подскажите почему , при выполнении строки 45 я получаю ошибку ? А именно при выполнении выражения c-&gt;fnz() ...

Вызов метода родителя - C++
Добрый вечер, как можно заставить метод &quot;не забыть&quot; вызвать этот же метод родителя ? Есть такая &quot;очень классная архитектура&quot;:...

Принудительный вызов метода родителя - C++
#include &lt;iostream&gt; using namespace std; class A { public: virtual void f() { cout &lt;&lt; &quot;A::F()&quot; &lt;&lt; endl; } virtual...

Вызов специфических для потомка функций, не зная класса потомка - C++
Доброго времени суток. Когда-то давно делал работу в C#, а сейчас захотел повторить то же в C++. Затык вот в чем. был у меня...

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

Добавлено через 1 минуту
или CElement тоже нельзя модифицировать?
antonboom
bmstu-team
301 / 136 / 56
Регистрация: 10.01.2012
Сообщений: 420
Записей в блоге: 10
28.01.2016, 10:44  [ТС]     Вызов метода потомка через указатель на родителя #3
Kastaneda, CElement модифицировать можно. Сейчас в нем и есть как раз два виртуальных метода
C++
1
2
3
virtual bool canFallDown() { return false; }
virtual void startFallDown() { }
// у камня, к примеру, они переопределены и используют друг друга
Но мне казалось, что как раз вызывается эта пустая реализация у элемента. Да и с чего бы ему вызывать метод потомка, если мы привели к CElement, а у него есть этот виртуальный метод да и еще и реализованный?
В любом случае, проверю еще раз, отпишусь.
Спасибо
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
28.01.2016, 10:45     Вызов метода потомка через указатель на родителя
Еще ссылки по теме:

Вызов метода базового класса из класса-потомка - C++
Нужно вызывать из метода, переопределенного в потомке, соответствующий метод базового класса. При этом они являются виртуальными. Вот...

вызов метода у указателя на указатель на класс - C++
Доброго времени суток! Простите за, возможно, глупый вопрос и/или его неточную формулировку, но вот что есть: class parent { ...

Возврат значения метода через указатель - C++
Здраствуйте, помогите зделать что бы возврат результатов с метода решения уравнения возвращался через указатель. #include &lt;iostream&gt; ...

Вызов деструктора [удаление через указатель] - C++
class A: public B { public: A() {} ~A() {std::cout &lt;&lt; &quot;del&quot;;} void someFn(A*); void someFn2(); }; void someFn(A*...

Вызов функции из массива, через указатель - C++
имею код #include &lt;iostream&gt; #include &lt;vector&gt; #include &lt;utility&gt; using namespace std; void Func() { cout&lt;&lt;&quot;pFunc()&quot;; } ...

Почему не возвращается значение через указатель из метода класса? - C++
Вот решил проверить поведение указателя в программе (я только учу C++), как оказалось после выхода из метода, указатель не указывает на...


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

Или воспользуйтесь поиском по форуму:
Kastaneda
Форумчанин
Эксперт С++
4514 / 2856 / 228
Регистрация: 12.12.2009
Сообщений: 7,249
Записей в блоге: 1
Завершенные тесты: 1
28.01.2016, 10:45     Вызов метода потомка через указатель на родителя #4
Цитата Сообщение от antonboom Посмотреть сообщение
Да и с чего бы ему вызывать метод потомка, если мы привели к CElement, а у него есть этот виртуальный метод да и еще и реализованный?
Будет использовано позднее связывание и вызовется правильный метод. Попробуй еще раз.
Yandex
Объявления
28.01.2016, 10:45     Вызов метода потомка через указатель на родителя
Ответ Создать тему
Опции темы

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