我基于多态性知道你不能调用非虚函数/方法
前:
class Entity
{
public:
Entity() { health = 10; }
void DisplayHealth() { std::cout << health << std::endl; }
protected:
int health;
};
class Player : public Entity
{
};
class Enemy : public Entity
{
void SetHealth(int n) { health = n; }
};
int main()
{
Entity *instance = new Enemy();
instance->SetHealth(1); // Error
return 0;
}
所以我想出来解决这个问题就是做这样的事情:
int main()
{
Entity *instance = new Enemy();
Enemy e = *(Enemy*)instance;
e.SetHealth(1);
instance = &e;
}
这对我的需求很好,但我想知道这是否是“正确”的做法。有没有一种更有效的方法来使用多态来调用子类方法?
答案 0 :(得分:1)
Entity *instance = new Enemy();
Enemy e = *(Enemy*)instance;
创建一个新的Enemy对象,然后将实例指向的内容分配给它。这是多余的。然后
instance = &e;
导致内存泄漏,因为您丢失了指向new Enemy()
的指针并且您没有将其删除。
int main()
{
Entity *instance = new Enemy();
Enemy *e = static_cast<Enemy*>(instance);
^^
e->SetHealth(1);
}
=============================================== ===================================
=============================================== ===================================
然而,看作Health
是基类Entity
的成员,您只需将setHealth
函数移动到实体即可完成。
class Entity
{
public:
Entity() { health = 10; }
void DisplayHealth() { std::cout << health << std::endl; }
void SetHealth(int n) { health = n; }
protected:
int health;
};
int main()
{
Entity *instance = new Enemy();
instance->SetHealth(1); // Not Error Anymore
return 0;
}