在对象数组(基本情况)和派生类之间动态转换

时间:2015-04-13 15:38:34

标签: c++ inheritance casting polymorphism

我有一个对象数组,其类是基类,数组的元素是派生类。

    Object *object [kNumPlayers] =
   {
        new Human ("Ms. Jones", 50, 1.0f, 2.0f),
        new Alien ("Mx. Charm", 70),
        new Human,
        new Alien,
   };

所以这里,Object是基类,Human和Alien是派生类。现在我的问题是我需要访问每个对象并添加额外的功能。在中,我需要访问object [0](这是Human)并添加需要添加的内容。所以我试过了,

   Human human0 = (Human)object[0]; // ERROR:'no matching function to call                  Human::Human(Object*&)'
                        OR
   Human *human0;
   human0 = dynamic_cast<Human*>(object[0]); //ERROR: cannot dynamic_cast 'object[0]' (of type 'class Oject*') to type 'class Human*' (source is not polymorphic)'

1 个答案:

答案 0 :(得分:4)

要编译dynamic_cast,规则是源必须是多态类 - 这意味着它必须至少有一个virtual函数,即使是它只有析构函数。在您的情况下,源类是Object类,它必须是多态的:

class Object
{
   public:
     virtual ~Object() = default; //at least, it should be virtual
     //etc
};

一旦你修复了代码至少应该编译。但是,有许多事情你应该避免在C ++中使用:

  • 避免使用C风格的数组(动态或其他)
    • 首选std::vectorstd::array
  • 避免自己管理记忆 - 也就是说,避免使用裸new
    • 首选RAII - 在您的情况下使用符合您需要的std::unique_ptrstd::shared_ptr

那就是你应该这样:

 std::array<std::shared_ptr<Object>, 10> objects {
        std::make_shared<Human>("Ms. Jones", 50, 1.0f, 2.0f),
        std::make_shared<Alien>("Mx. Charm", 70)
        //etc
 };

并演员:

 std::shared_ptr<Human> human = std::dynamic_pointer_cast<Human>(objects[0]);

希望有所帮助。