c++ - 将指针从基类型转换为子类型

标签 c++ polymorphism

我正在为我的项目构建一个简单的游戏设计。我有以下类(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/

相关文章:

c++ - 关于 reinterpret_cast 和指针

Java 方法在一种情况下可以正确地看到继承,但在另一种情况下却不能,罪魁祸首是什么?

c++ - 如何使用专用线程类MyThreadClass

java - List<Dog> 是 List<Animal> 的子类吗?为什么 Java 泛型不是隐式多态的?

java - 多态歧义区分是如何工作的?

c++ - 我怎样才能实现一个函数来调用任何(任意)函数及其(任意)参数?

c++ - 与内置函数的命名冲突?

c++ - 椭圆旋转矩阵?

c++ - clang_complete 错误 : unknown argument: '--std=c++0x'

C++ 使用 SSE 指令比较巨大的整数 vector