错误 1 错误 C2259:'Player':无法实例化抽象类

Error 1 error C2259: 'Player' : cannot instantiate abstract class

本文关键字:错误 实例化 抽象类 Player C2259      更新时间:2023-10-16

为什么我不能实例化?为什么播放器是一个抽象类?我是否只在基类中声明了纯虚拟函数?

class Object
{
protected:
public:
    virtual void DrawOnScreen() = 0;
};
class Creature : public Object
{
public:
    virtual void DrawOnScreen()=0;
    virtual  void Eat(Object*)=0;
    virtual void move(Direction)=0;
};
class Player : public Creature
{
    void Player::DrawOnScreen()
    {
        cout << "position= (" << get_x() << "," << get_y() << ")" << endl << "player's score " << points << endl;
        if (get_isKilled()) cout << "It is Killed " << endl;
        else cout << "It is Alive " << endl;
    }
    void Player::eat(Object* p)
    {
        Point* chk;
        chk = dynamic_cast<Point*>(p);
        if ((chk != 0) && (get_x() == chk->get_x()) && (get_y() == chk->get_y()) && (chk - > get_isExist()))
        {
            points = points + chk->get_weight();
            chk->set_isExist(false);
        }
    }
    void Player::move(Direction d)
    {
        if (d == UP)
        {
            y = y + 2;
        }
        if (d == DOWN)
        {
            y = y - 2;
        }
        if (d == RIGHT)
        {
            x = x + 2;
        }
        if (d == LEFT)
        {
            x = x - 2;
        }
    }
}

问题是,由于继承和错误的重写,您无法使用至少一个纯虚拟方法实例化类,而这种情况在这里发生。

这是一个拼写错误:

void Player::eat(Object*p)

你真正的意思是用资本"吃饭",因此你实际上并不是凌驾于一切之上。你应该写这样的:

void Player::Eat(Object*p)

除此之外,您确实应该删除类中方法的Player::作用域,或者将类似的方法移到外部。

此外,请充分利用C++11 override关键字来避免此类问题,因此类似这样的事情会给您带来编译错误:

void Eat(Object *p) override;