如何"跳过"某些子类功能

时间:2014-05-30 02:39:33

标签: c++ arrays polymorphism

我不确定如何准确地标题,但我试图找出具有多态性的东西。

所以基本上,我希望有一个父类(对象)的数组,它包含了一堆子类(那些是不可碰撞的子类)。但是,我希望能够将此数组放入循环并仅为可碰撞的子类运行碰撞函数,但由于其他子类没有碰撞函数,我该怎么做?

(看起来像这样)

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}}函数,同时避免错误?或者这样的事情是不可能的,我只需要制作两个独立的阵列?

我希望我能很好地解释我的问题。

(我试着研究这个,但每次尝试我都被发送到多态性的基础知识)

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必须公开继承,否则您将无法处理对象操作系统CollidableObjectUncollidableObject作为Object的对象。