【发布时间】:2019-03-03 12:16:17
【问题描述】:
我目前有以下结构
class A
class B : public A
class C : public A
我在A 和B 中定义了虚拟方法,C 正在覆盖它们。方法是这样的
bool C::CheckCollision(shared_ptr<B> box);
bool B::CheckCollision(shared_ptr<C> triangle);
我还有一个shared_ptr<A> 的向量,其中存储了所有游戏对象。问题是我无法执行以下操作
for (int i = 0; i < objects.size(); i++)
{
for (int j=i; j < objects.size(); j++
{
objects[i]->CheckCollision(objects[j]);
}
}
我收到一条错误消息,指出参数列表与重载函数不匹配。这是有道理的,因为我试图通过shared_ptr<A> 我期待shared_ptr<B> 或shared_ptr<C>,但我该如何解决这个问题?还有其他方法吗?
【问题讨论】:
-
你不能绕过这个。如果
CheckCollision()使用了仅在B或C中可用的东西,并且您将传递一个指向A对象的std::shared_ptr<A>怎么办?您需要重新考虑您的设计。 -
有道理,我想到的其他事情是我可以使用枚举来存储类型信息并执行虚拟
GetType函数。我知道你并不了解整个情况,但这听起来很糟糕吗? -
对我来说,
enum(最好是enum class)持有一个类型的C味道太浓了,但有时它是正确的工具。如果你真的想要多态,你需要坚持virtualsomewhere。请注意,可以使用dynamic_cast进行类型检查,但这很少是理想的解决方案(不仅速度慢,而且会给代码增加很多噪音)。 -
我认为
CheckCollision应该属于A,然后它会调用虚函数——比如BoundingBox()——来获取运行碰撞检测算法所需的信息。跨度> -
你有
virtual CheckCollision(shared_ptr<B> box)和virtual CheckCollision(shared_ptr<C> box),在你的A类中声明?因为如果是这样,那么设计肯定会被破坏。A不应该知道B和C。如果你在A中没有virtual CheckCollision(shared_ptr<B> box)和virtual CheckCollision(shared_ptr<C> box),那么你就没有你覆盖的函数。
标签: c++ inheritance polymorphism shared-ptr double-dispatch