重载一个函数,以便它可以将基类转换为派生类作为参数

时间:2016-10-20 21:21:29

标签: c++ pointers inheritance polymorphism virtual

我正在尝试为3D世界建模,其中包含球体和胶囊的对象。我以一种方式对其进行建模,即shape类是基类,并且sphere和capsule类继承自基类(如果我正确实现它,它是一个完美的虚拟类)。

class Shape
{

protected:
    COLORREF color;

public:
    virtual COLORREF getColor() =0;


};


    class Capsule: public Shape
{

private:
    Point start;
    Direction direction;
    int dist, r;
    //Color color;
    //COLORREF color;

public:

    Capsule(Point start, Direction direction, int inputdist, int inputr, COLORREF inputcolor);

    COLORREF getColor();

};

    class Sphere : public Shape
{

private:
    int r;
    Point p;
    //Color color;
    //COLORREF color;

public:
    Sphere(int x, int y, int z , int r, COLORREF inputcolor) ;
    COLORREF getColor();
    Point getpoint();
    int getradius();
};

然后我在另一个类中有一个函数,它接受指向Sphere对象的指针或指向Capsule对象的指针。

bool Collideswith(Sphere *s);
bool Collideswith(Capsule *c);

但是当我打电话

时,我想强制调用上述函数之一
Shape *myshape = new Sphere(0,0,0,4, RGB(0,0,0));
 if(myRay.Collideswith(myshape)) { blah... }

但问题是,因为Collideswith只接受指向Capsules的指针或指向球体的指针,所以当我现在调用它时,它不会接受指向我传入的指针,这是一个指向形状的指针。

我无法改变我传入形状指针的事实,但我需要弄清楚如何让Collideswith()函数获取形状指针。 (也许通过创建一个带有形状指针的重载函数,可以看出形状是一个胶囊还是一个球体?)

任何建议都会非常感激。 感谢

1 个答案:

答案 0 :(得分:3)

Shape班级中声明虚拟方法:

class Shape {

// ...

    virtual bool CollidesWith()=0;
};

并在每个子类中实现它:

bool Sphere::CollidesWith()
{
   // ...
}

bool Capsule::CollidesWith()
{
   // ...
}

现在,让其中每一个调用您在问题中提到的其他类中的其他CollidesWith()方法之一,只需传递this

如果您愿意,可以实现另一个重载:

bool CollidesWith(Shape *s)
{
      return s->CollidesWith();
}

您的虚拟方法可以采用您需要的任何其他参数,并在必要时转发它们。例如,您的虚拟方法可以在示例中使用myRay参数,每个子类只需调用myRay,就像您所需代码的示例一样。