0

我知道基于多态性,您不能调用非虚函数/方法

前任:

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; 
}

这可以很好地满足我的需求,但我想知道这是否是“正确”的做法。有没有更有效的方法来使用多态调用子类方法?

4

1 回答 1

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); 
}

==================================================== =================================

==================================================== =================================

但是看到 asHealth是基类的成员Entity,您可以将setHealth函数移动到 Entity 并完成它。

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;
}
于 2013-04-20T04:07:37.010 回答