【发布时间】:2011-05-17 01:59:50
【问题描述】:
我从《更有效的 C++》一书中复制以下文字。
第 31 条:使函数相对于多个对象为虚拟。
class GameObject { ... };
class SpaceShip: public GameObject { ... };
class SpaceStation: public GameObject { ... };
class Asteroid: public GameObject { ... };
最常见的双重调度方法通过 if-then-elses 链将我们带回到虚拟函数仿真的无情世界。在这个严酷的世界中,我们首先发现 otherObject 的真实类型,然后针对所有可能性对其进行测试:
void SpaceShip::collide(GameObject& otherObject)
{
const type_info& objectType = typeid(otherObject);
if (objectType == typeid(SpaceShip)) {
SpaceShip& ss = static_cast<SpaceShip&>(otherObject);
process a SpaceShip-SpaceShip collision;
}
else if (objectType == typeid(SpaceStation)) {
SpaceStation& ss =
static_cast<SpaceStation&>(otherObject);
process a SpaceShip-SpaceStation collision;
}
...
}
问题来了:
Q1> 为什么我们在这里使用 static_cast 而不是明显的 dynamic_cast?
Q2> 在这种情况下它们是一样的吗?
谢谢
// 更新了 //
其实我对问题2更感兴趣。
例如,
class base {};
class subclass : public base {};
base *pSubClass = new subclass;
subclass *pSubClass1 = static_cast<subClass*> (pSubClass);
// 尽管我知道我们应该在这里使用 dynamic_cast,但在这种情况下 static_cast 是否正确地完成了工作?
【问题讨论】:
-
真正的问题是:为什么在这里使用
dynamic_cast而不是static_cast?
标签: c++