我有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。
答案 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中找到了所有这些内容。