Как заставить программу использовать перегрузку функции для объектов производного класса - PullRequest
2 голосов
/ 07 мая 2019

У меня есть классы Deck, абстрактный класс Card и Spell and Minion, которые оба являются производными от Class.У меня есть vector<unique_ptr<Card> > всех существующих карт, и теперь я хочу поместить их в колоды.Я хочу использовать void Deck::addCard(<unique_ptr<Card>) перегрузки для Minion и Spell.

Я пытался изменить аргументы и параметры на «тупой» * указатель или просто на карточку (которая не работает, я знаю), ссылки, не-ссылки и т. Д. *

Вызов addCard

Deck tmp;
for( const auto & it : mAllCards )
{
  cout << typeid( *it ).name() << endl;
  tmp.addCard( it );
}

функций addCard

void Deck::addCard( const unique_ptr<Card> & card )
{
    cout << "basic" << endl;
}

void Deck::addCard( const unique_ptr<Minion> & minion )
{
    cout << "minion" << endl;
}

void Deck::addCard( const unique_ptr<Spell> & spell  )
{
    cout << "spell" << endl;
}

Проблема в том, что версия Card вызывается каждый раз, а не варианты для производных типов.Во всем typeid говорит Миньон или Заклинание, а не Карта.

1 Ответ

3 голосов
/ 07 мая 2019

Это не работает, потому что перегрузки в C ++ разрешаются во время компиляции.

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

Как то так.

class Card {
public:
    virtual void print() { std::cout << "basic" << std::endl; }
}

class Minion : public Card {
public:
    void print() override { std::cout << "minion" << std::endl; }
}

class Spell : public Card {
public:
    void print() override { std::cout << "spell" << std::endl; }
}

Затем, чтобы использовать эту функцию печати, вы будете делать это так.

void Deck::addCard(const unique_ptr<Card>& card)
{
    card.print();
}

В противном случае всегда есть шаблон двойной отправки или, возможно, шаблон посетителя .

Нашел все это в этом старом посте .

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