如何使程序对派生类对象使用函数重载

时间:2019-05-07 07:44:57

标签: c++ polymorphism

我有Deck类,Card类和Spell和Minion类,它们都是从Class派生的。我已经拥有vector<unique_ptr<Card> >的所有现有卡,现在我想将它们放入Decks。我想对Minion和Spell使用void Deck::addCard(<unique_ptr<Card>)重载。

我尝试将参数和参数更改为“哑” *指针,或者只是Card(我知道这是行不通的),引用,非引用等...

致电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说是Minion或Spell,而不是Card。

1 个答案:

答案 0 :(得分:3)

它不起作用,因为C ++中的重载在编译时已解决。

您应该考虑使用 var bearerToken = 'Bearer '+ access_token; var options = { url: 'https://googleads.googleapis.com/v1/customers:listAccessibleCustomers', headers: { 'Authorization': bearerToken, 'developer-token': 'XXXX_XXXXXXXXXX' } }; request(options, function(err, response) { console.log(response); }); 中的虚拟打印功能。

这样的事情。

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; }
}

否则,总是存在double dispatch模式或visitor pattern

this old post中找到了所有这些内容。