gpt4 book ai didi

c++ - 如何让程序对派生类对象使用函数重载

转载 作者:搜寻专家 更新时间:2023-10-31 01:25:58 25 4
gpt4 key购买 nike

我有类 Deck、抽象类 Card 以及 Spell 和 Minion,它们都派生自 Class。我有vector<unique_ptr<Card> >所有现有卡片,现在我想将它们放入卡片组中。我想使用 void Deck::addCard(<unique_ptr<Card>) Minion 和 Spell 的重载。

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

调用addCard

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

添加卡片函数

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。

最佳答案

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

否则总是double dispatch模式或者可能是visitor pattern .

this old post 中找到所有这些.

关于c++ - 如何让程序对派生类对象使用函数重载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56017817/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com