gpt4 book ai didi

c++ - 重载一个函数,使其可以将基类转换为派生类作为参数

转载 作者:太空狗 更新时间:2023-10-29 21:14:43 27 4
gpt4 key购买 nike

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

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 只接收指向胶囊的指针或指向球体的指针,当我现在调用它时,它不会接收指向我传入的内容的指针,这是一个指向形状的指针.

我无法改变我正在传递形状指针这一事实,但我需要弄清楚如何让 Collideswith() 函数采用形状指针。 (也许通过创建一个重载函数来获取形状指针,并能以某种方式确定该形状是胶囊还是球体?)

任何建议将不胜感激。谢谢

最佳答案

Shape 类中声明一个虚方法:

class Shape {

// ...

virtual bool CollidesWith()=0;
};

并在您的每个子类中实现它:

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

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

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

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

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

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

关于c++ - 重载一个函数,使其可以将基类转换为派生类作为参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40164781/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com