我正在为我的项目构建一个简单的游戏设计。我有以下类(class):
class Character
{
public:
virtual void Display();
virtual void SetParameters( char* param, ... );
};
class NonPlayableCharacter : public Character
{
public:
virtual void Display();
virtual void SetParameters( char* paaram, ... );
int GetNPCState();
}
然后我有一堆派生自 Character 或 NonPlayableCharacter 的类。我这样定义它:
std::vector<Character*> _allChar;
我的问题是在任何给定时间我都想对 vector 的一个元素执行一些操作。所以从 vector 中取出一个元素我不能直接调用方法 GetNPCState()
因为 vector 中的元素是 Character* 类型。所以这样做:
_allChar[0]->GetNPCState();
没用。所以我试着用著名的 dynamic_cast 来做:
NonPlayableCharacter* test = dynamic_cast<NonPlayableCharacter*>(_allChar[0]);
test->GetNPCState();
最后一次尝试的问题是 GetNPCState()
崩溃,因为对象为 null,而且我知道一个事实(通过调试)_allChar[0] 不为 null。
最佳答案
C++ 中有几种类型的转换(4),这里对其中 2 种感兴趣:
-
static_cast
假设你知道自己在做什么 -
dynamic_cast
在运行时检查您是否“猜对”了
注意:简化为 dynamic_cast
还允许交叉转换和涉及虚拟基地的转换。
dynamic_cast
有3个版本,真的,取决于目标的性质:
- 如果目标是引用(即
dynamic_cast<T&>(u)
),那么如果检查失败dynamic_cast
抛出std::bad_cast
异常 - 如果目标是一个指针(即
dynamic_cast<T*>(p)
),那么如果检查失败dynamic_cast
返回空指针 - 最后,作为一个特例,如果目标是
void*
, 然后dynamic_cast
而是返回完整对象的地址
在这种情况下,您可以:
- 从
dynamic_cast<NonPlayableCharacter*>(_allChar[0])->getNPCState()
切换至dynamic_cast<NonPlayableCharacter&>(*_allChar[0]).getNPCState()
, 让异常传播 - 测试转换结果(此处为
NonPlayableCharacter* test
)是否为无效
关于c++ - 将指针从基类型转换为子类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13013373/