强制调用“最高”重载函数而不是基函数

时间:2015-10-14 20:31:25

标签: c++ function inheritance overloading

我有一个基类和许多其他类(都来自基类),它们都使用相同的参数实现相同的功能。我的问题如下:

class Entity
{
public:
    int getx();
    int gety();
};

class Enemy : public Entity
{
public:
    int getx();
    int gety();
};

class Player : public Entity
{
public:
    int getx();
    int gety();
};

// all of the implementations actually differ

int distance(Entity *e1, Entity *e2)
{
    return e2->getx() + e2->gety() - e1->getx() - e2->gety();
    // here, it is always Entity::getx and Entity::gety that are called
}

我想要的是,如果我拨打distance(e, p) eEnemy以及p一个Player,则会调用相应的函数重载,而不是实体的实施。

如果实际可行,我将如何实现这一目标?我在这里搜索了很多,而我发现的最接近的问题是在不同的环境中使用模板,所以它对我没有帮助:Template function overload for base class

先谢谢。

2 个答案:

答案 0 :(得分:0)

正如@Amit在评论中所述,您正在寻找虚拟功能。您可以按如下方式更新Entity课程:

class Entity
{
public:
    // Add a virtual destructor to allow deletion through base pointer to work correctly
    // (e.g., E* e = new Player(); delete e;)
    virtual ~Entity();

    virtual int getx() const = 0; // 'const' isn't related to your question but
    virtual int gety() const = 0; // good to have, '= 0' is optional but helpful if
                                  // the base class isn't providing an implementation
};

假设使用C ++ 11,在派生类中使用override也很不错。

class Enemy : public Entity
{
public:
    // 'const' only necessary if specified in the base class
    // 'virtual' is more documentation it would still be virtual if omitted
    // 'override' enforces that the signature matches a virtual function
    virtual int getx() const override;
    virtual int gety() const override;
};

答案 1 :(得分:0)

您尝试做的事实上是 OOP 中的一个基本概念:虚拟功能

这个想法正如你所描述的那样:

  

虚函数是一个在通过基类指针访问时被子类实现替换的函数。

语法非常简单,只需将关键字virtual添加到基类函数声明中即可。使用override关键字标记覆盖函数(子类的函数)是一种很好的做法(尽管不是必需)。

这里是reference of virtual functions

您可以将代码更改为:

class Entity
{
public:
    virtual int getx();
    virtual int gety();
};

class Enemy : public Entity
{
public:
    int getx() override;
    int gety() override;
};

class Player : public Entity
{
public:
    int getx() override;
    int gety() override;
};

// all of the implementations actually differ

int distance(Entity *e1, Entity *e2)
{
    return e2->getx() + e2->gety() - e1->getx() - e2->gety();
    // Now, the proper getx & gety are being called
}