如何使程序使用功能过载用于派生的类对象
How to make the program use function overload for derived class objects
我都有类甲板,抽象的类卡以及咒语和奴才,这些都源自类。我有所有现有卡的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();
}
否则总是有双重调度模式或访客模式。
在这个旧文章中找到了所有这些。
相关文章:
- 给定一个类型,如何派生一个泛型更广泛的类型(例如,用于溢出安全求和)?
- 如何将一个变量用于父类和派生类
- 用于从一个基派生的类的GDB漂亮的打印机
- 为什么"运算符<<"不适用于指向派生类型的成员?
- 继承函数是否适用于 C++ 中的基类元素或派生类元素?
- 用于填充 Base 和派生对象的 shared_ptr 向量的函数模板
- 如何使程序使用功能过载用于派生的类对象
- 多态性是否适用于值?或者在按(基)值返回时使用派生类的移动构造函数
- 如何将派生类型的对象放在用于基本类型的向量中
- 用于确定一个类是否派生自另一个类的代码说明
- 用于std::is_base_of的派生类的C++模板函数
- 为什么<<运算符不适用于来自 ofstream 的派生类?
- 自动计数器用于派生类 /替代方案
- 用于抽象基类和派生类的工厂功能的C 返回类型
- 除当前类型外,可用于从Base派生的所有类型的隐式构造函数
- 用于初始化派生类型的泛型 switch 语句
- 用于在不使用 RTTI 的情况下缓存不同派生类型的设计模式
- ConstexPR 用于派生类中的 null 初始化构造函数
- 如何将MPI派生的数据类型用于三维数组
- 用于序列化的来自CObject的派生将导致访问时出现编译器错误