gpt4 book ai didi

c++ - 如果在 C++ 中只有指向基类的指针,请使用派生类参数重载函数

转载 作者:太空狗 更新时间:2023-10-29 20:09:29 24 4
gpt4 key购买 nike

我看到有人使用指向基类的指针容器来保存共享相同虚函数的对象组。是否可以将派生类的重载函数与这些基类指针一起使用。很难解释我的意思,但(我认为)很容易用代码展示

class PhysicsObject // A pure virtual class
{
// Members of physics object
// ...
};

class Circle : public PhysicsObject
{
// Members of circle
// ...
};

class Box : public PhysicsObject
{
// Members of box
// ...
};

// Overloaded functions (Defined elsewhere)
void ResolveCollision(Circle& a, Box& b);
void ResolveCollision(Circle& a, Circle& b);
void ResolveCollision(Box& a, Box& b);

int main()
{
// Container to hold all our objects
std::vector<PhysicsObject*> objects;

// Create some circles and boxes and add to objects container
// ...

// Resolve any collisions between colliding objects
for (auto& objA : objects)
for (auto& objB : objects)
if (objA != objB)
ResolveCollision(*objA, *objB); // !!! Error !!! Can't resolve overloaded function
}

我的第一个想法是让这些函数也成为虚拟类成员(如下所示),但我很快意识到它有完全相同的问题。

class Circle;
class Box;
class PhysicsObject // A pure virtual class
{
virtual void ResolveCollision(Circle& a) = 0;
virtual void ResolveCollision(Box& a) = 0;
// Members of physics object
// ...
};

class Box;
class Circle : public PhysicsObject
{
void ResolveCollision(Circle& a);
void ResolveCollision(Box& a);
// Members of circle
// ...
};

class Circle;
class Box : public PhysicsObject
{
void ResolveCollision(Circle& a);
void ResolveCollision(Box& a);
// Members of box
// ...
};

通过谷歌搜索问题似乎可以使用转换来解决,但我无法弄清楚如何找到要转换为的正确类型(它也很丑陋)。我怀疑我问错了问题,有一种更好的方法来构建我的代码,它可以回避这个问题并获得相同的结果。

最佳答案

使用双重调度,它会是这样的:

class Circle;
class Box;

// Overloaded functions (Defined elsewhere)
void ResolveCollision(Circle& a, Box& b);
void ResolveCollision(Circle& a, Circle& b);
void ResolveCollision(Box& a, Box& b);
class PhysicsObject // A pure virtual class
{
public:
virtual ~PhysicsObject() = default;

virtual void ResolveCollision(PhysicsObject&) = 0;
virtual void ResolveBoxCollision(Box&) = 0;
virtual void ResolveCircleCollision(Circle&) = 0;
};

class Circle : public PhysicsObject
{
public:
void ResolveCollision(PhysicsObject& other) override { return other.ResolveCircleCollision(*this); }
void ResolveBoxCollision(Box& box) override { ::ResolveCollision(*this, box);}
void ResolveCircleCollision(Circle& circle) override { ::ResolveCollision(*this, circle);}
// ...
};

class Box : public PhysicsObject
{
public:
void ResolveCollision(PhysicsObject& other) override { return other.ResolveBoxCollision(*this); }
void ResolveBoxCollision(Box& box) override { ::ResolveCollision(box, *this);}
void ResolveCircleCollision(Circle& circle) override { ::ResolveCollision(circle, *this);}
// ...
};

关于c++ - 如果在 C++ 中只有指向基类的指针,请使用派生类参数重载函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46052956/

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