多态性使功能无法访问

时间:2011-05-04 15:34:34

标签: c++ class function polymorphism

我有一张Shopable的地图,其中的内容已经初始化为:

Shopable* something = new Consumable();

Consumable有一个函数Heal,但Shopable却没有。我需要将地图保留为某个函数参数的Shopable映射,但是当我尝试这样做时:

consumables[itemName]->Heal(this);

在另一个函数中,它说“Class'Tableable'没有成员'Heal'”。

我怎样才能解决这个问题?

5 个答案:

答案 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的基础知识。