我有一张Shopable
的地图,其中的内容已经初始化为:
Shopable* something = new Consumable();
Consumable
有一个函数Heal
,但Shopable却没有。我需要将地图保留为某个函数参数的Shopable
映射,但是当我尝试这样做时:
consumables[itemName]->Heal(this);
在另一个函数中,它说“Class'Tableable'没有成员'Heal'”。
我怎样才能解决这个问题?
答案 0 :(得分:4)
使用dynamic_cast,或在Shopable下创建虚拟虚拟治疗。
Consumable *con = dynamic_cast<Consumable*>(consumables[itemName]);
if(con)
con->Heal();
//else this shopable is not really a consumable
或者,在Shopable下创建一个名为Heal()的虚函数,其中没有任何内容。或者在其中包含调试器警告(如assert(0)),以便您知道它是否被意外调用。或者制作一个纯虚拟(virtual void Heal() = 0;
),如果它被调用,你的prorgam就会崩溃。
答案 1 :(得分:3)
Polymorphism仅允许虚拟分派基类中存在的虚函数。您不能在基类中不存在的基类上调用函数,只是因为它可能存在于派生类中。
此外,你应该真正的意思是Shoppable* something = new Consumable();
,除非Shoppable
本身只是某种指针类型的typedef。
答案 2 :(得分:1)
是否能治愈每个Shoppable应该做的事情?如果是这样,您应该在Shoppable中将其声明为pure virtual function并在所有子类中实现它。
答案 3 :(得分:1)
在Shopable上使Heal()成为一个纯粹的虚拟世界?
答案 4 :(得分:1)
如果Heal()仅适用于从Consumable派生的特定类,那么您应该使用Alekseyev的使用dynamic_cast的解决方案。
如果尚未启用RTTI,则需要启用RTTI,对于性能关键代码,dynamic_cast可能会产生负面影响。
您可能需要查看this site,它解释了C ++中RTTI的基础知识。