我有一个基类和许多其他类(都来自基类),它们都使用相同的参数实现相同的功能。我的问题如下:
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)
e
和Enemy
以及p
一个Player
,则会调用相应的函数重载,而不是实体的实施。
如果实际可行,我将如何实现这一目标?我在这里搜索了很多,而我发现的最接近的问题是在不同的环境中使用模板,所以它对我没有帮助:Template function overload for base class
先谢谢。
答案 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
}