我不确定如何准确地标题,但我试图找出具有多态性的东西。
所以基本上,我希望有一个父类(对象)的数组,它包含了一堆子类(那些是不可碰撞的子类)。但是,我希望能够将此数组放入循环并仅为可碰撞的子类运行碰撞函数,但由于其他子类没有碰撞函数,我该怎么做?
(看起来像这样)
class Object
{
protected:
Image image; // Pseudo code to make point
public:
void Collision() = 0;
//Constructor/Destructor
Object(void);
~Object(void);
};
class Collidable : Object
{
private:
Position myPosition; // Pseudo code to make point
public:
void Collision(); // Has collision function for parent class
//Constructor/Destructor
Collidable(void);
~Collidable(void);
};
class Uncollidable : Object
{
private:
Position myPosition; // Pseudo code to make point
public:
// No collision function for parent class
//Constructor/Destructor
Uncollidable(void);
~Uncollidable(void);
};
int main()
{
Collidable collide1, collide2, collide3;
Uncollidable uncollide1, uncollide2, uncollide3;
Object *objects[] { collide1, collide2, uncollide1, uncollide2, uncollide3, collide3 };
for(int i = 0; i < 6; i++)
{
objects[i].Collide(); // Should not work.
}
return 0;
}
^(这只是一个帮助显示我的问题的示例,请原谅一些语法错误,如果有的话)
我很确定,因为void Collide()
类Uncollidable
中不存在void Collide()
,所以这样的内容会出错。那么我怎样才能在循环中运行{{1}}函数,同时避免错误?或者这样的事情是不可能的,我只需要制作两个独立的阵列?
我希望我能很好地解释我的问题。
(我试着研究这个,但每次尝试我都被发送到多态性的基础知识)
答案 0 :(得分:2)
你可以这样做:
for(int i = 0; i < 6; i++)
{
Collidable c = dynamic_cast<Collidable*>(objects[i]);
if(c != nullptr) // dynamic_cast will return null if objects[i] is not of type Collidable
c->Collide(); // Should work.
}
在您的代码中有一个错误,您已在类Collide()
中创建了Object
纯虚拟,但您并未覆盖 Uncollidable
。不起作用。 在Uncollidable
中覆盖(这是不合适的),或者为Object::Collide()
提供默认正文(这也不合适)。
有一个更好的设计,将所有通用接口放在Object
中,在其他接口中分离出不同的行为。它将导致良好的OO设计(符合 IS-A 关系)
class Object
{
protected:
Image image; // Pseudo code to make point
public:
Object(void);
~Object(void);
//other common interface
};
class Collidable // this is an interface that represent 'collidable' behavior
{
public:
virtual void Collision() = 0;
}
class CollidableObject : public Object, public Collidable
{ ... }
class UncollidableObject : public Object
{ ... }
注意: Object
必须公开继承,否则您将无法处理对象操作系统CollidableObject
和UncollidableObject
作为Object
的对象。