Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/132.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 从子类调用非虚方法_C++_Class_Function_Polymorphism_Parent - Fatal编程技术网

C++ 从子类调用非虚方法

C++ 从子类调用非虚方法,c++,class,function,polymorphism,parent,C++,Class,Function,Polymorphism,Parent,根据多态性,我知道您不能调用非虚拟函数/方法 例: 这适合我的需要,但我想知道这是否是“正确”的方法。有没有更有效的方法使用多态性调用子类方法 Entity *instance = new Enemy(); Enemy e = *(Enemy*)instance; 创建一个新的敌人对象,然后将实例指向的对象指定给它。这是多余的。然后 instance = &e; 导致内存泄漏,因为您刚刚丢失了指向新敌人()的指针,并且尚未将其删除 我将把setter函数添加到实体中,因为运行状况

根据多态性,我知道您不能调用非虚拟函数/方法

例:

这适合我的需要,但我想知道这是否是“正确”的方法。有没有更有效的方法使用多态性调用子类方法

Entity *instance = new Enemy(); 
Enemy e = *(Enemy*)instance;
创建一个新的敌人对象,然后将实例指向的对象指定给它。这是多余的。然后

instance = &e;
导致内存泄漏,因为您刚刚丢失了指向新敌人()的指针,并且尚未将其删除



我将把setter函数添加到实体中,因为运行状况在实体中。然后通过public
Entity::SetHealth()
@billz good point调用它。Donno为什么OP特别想这么做。但你是对的,至少我应该建议这样做。这不是我想在我的程序中做的,只是一个简单的例子来解释我想做什么的概念,但这是为了启发。事实上,我首先使用了这个方法,然后又恢复到我发布的方法,但我甚至没有想到内存泄漏。愚蠢的想法哦,好吧,谢谢你help@CodingMadeEasy然后进行
static\u cast
。我想这就是你需要的。
Entity *instance = new Enemy(); 
Enemy e = *(Enemy*)instance;
instance = &e;
int main()
{
    Entity *instance = new Enemy(); 
    Enemy *e = static_cast<Enemy*>(instance);  
          ^^ 
    e->SetHealth(1); 
}
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;
}