我正在尝试为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()函数获取形状指针。 (也许通过创建一个带有形状指针的重载函数,可以看出形状是一个胶囊还是一个球体?)
任何建议都会非常感激。 感谢
答案 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
,就像您所需代码的示例一样。