如何使程序使用功能过载用于派生的类对象

How to make the program use function overload for derived class objects

本文关键字:派生 用于 对象 程序 何使 功能      更新时间:2023-10-16

我都有类甲板,抽象的类卡以及咒语和奴才,这些都源自类。我有所有现有卡的vector<unique_ptr<Card> >,现在我想将它们放入甲板上。我想将void Deck::addCard(<unique_ptr<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;
}

问题在于,卡版本每次都称为卡版本,而不是派生类型的变体。typeid typeid说奴才或咒语,而不是卡。

它不起作用,因为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();
}

否则总是有双重调度模式或访客模式。

在这个旧文章中找到了所有这些。