Полиморфизм делает функцию недоступной - PullRequest
1 голос
/ 04 мая 2011

У меня есть карта Shopable с, в которой есть вещи, которые были инициализированы следующим образом:

Shopable* something = new Consumable();

Consumable имеет функцию Heal, но Shopable нет.Мне нужно, чтобы карта оставалась картой Shopable для какого-либо параметра функции, но когда я пытаюсь выполнить:

consumables[itemName]->Heal(this);

в другой функции, он говорит, что «Класс« Shopable »не имеет члена« Лечение »".

Как я могу обойти это?

Ответы [ 5 ]

4 голосов
/ 04 мая 2011

Либо dynamic_cast, либо создайте виртуальный фиктивный Heal в Shopable.

Consumable *con = dynamic_cast<Consumable*>(consumables[itemName]);
if(con)
    con->Heal();
//else this shopable is not really a consumable

В качестве альтернативы, создайте виртуальную функцию с именем Heal () в Shopable, в которой ничего нет.Или с предупреждением отладчика (например, assert (0)), чтобы вы знали, вызван ли он случайно.Или сделайте чисто виртуальный (virtual void Heal() = 0;), тогда ваш проргам рухнет, если он будет вызван.

3 голосов
/ 04 мая 2011

Полиморфизм позволяет только виртуальную диспетчеризацию виртуальных функций, которые существуют в базовом классе. Вы не можете вызывать функцию в базовом классе, который не существует в базовом классе, просто потому, что он может существовать в производном классе.

Кроме того, вы должны иметь в виду Shoppable* something = new Consumable();, если Shoppable само по себе не является просто typedef для некоторого типа указателя.

1 голос
/ 04 мая 2011

Если Heal () применяется только к определенному классу, который был получен из Consumable, тогда вы должны согласиться с решением Алексеева использовать dynamic_cast.

Вам нужно будет включить RTTI, если он еще не включен и для критически важного кода кода dynamic_cast может оказать негативное влияние.

Возможно, вы захотите взглянуть на этот сайт который объясняет основы RTTI в C ++.

1 голос
/ 04 мая 2011

Сделать Heal () чистым виртуальным на Shopable?

1 голос
/ 04 мая 2011

Является ли Heal чем-то, что должен делать каждый Shoppable? Если это так, вы должны объявить ее как чисто виртуальную функцию в Shoppable и реализовать ее во всех подклассах.

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