从子类调用非虚方法

时间:2013-04-20 04:03:26

标签: c++ class function polymorphism parent

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

前:

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

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

1 个答案:

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