向下转换为子类的问题,多态无效

时间:2015-10-17 19:29:33

标签: c++ types casting polymorphism

我对c ++很陌生,我只是试图掌握它使用的指针和语法。我已经使用了大约6个星期,我正在制作一个小型游戏引擎,试图在编程方面做得更好。我目前有一个列表,它将保存Transforms,这是我用来保存对象基本特征的超类。我有两个子类用于我的变换,GameObject和Primitive。

基元是基本形状,例如平面和立方体,其中游戏对象是包含子项和父项的对象。我已经以这样的方式创建了转换可以是父级并且有子级的,因此可以连接这些子类以进行移动转换等。

这一切都通过多态实现,但是当我尝试在我的变换列表上调用渲染器时,它将调用驻留在transform中的Update的超类版本。它在理论上不应该像其他语言一样。所以我不得不尝试将它们投射到各自的课程中,这有点麻烦,但我遇到了一个问题。

令人恼火的是,我不能像(Primtive)变换一样。它还搞砸了变量primitiveType,它使它成为一些奇怪的大数。

for (Transform go : gameObjects)
{

    if (go.type == TYPE_MESH)
    {

        Transform* t = new Transform();
        t = &go;
        Primitive* primitive = static_cast<Primitive*>(t);

        if (primitive->primitiveType == P_CUBE)
        {
            Cube* cube = static_cast<Cube*>(primitive);
            cube->Update();
        }
        //delete t;
    }

    if (go.type == TYPE_GAMEOBJECT)
    {

    }

我注释掉的原因&#34;删除t;&#34;是不是因为某些原因打破了编译器,当它真的不应该被我看到。所以目前它会导致小内存泄漏。

发生了什么事?我的所有更新函数都是用虚拟void Update()编写的,所以不管变量是什么形式都没关系?无论是变换还是原语,函数应该首先调用应用于它的任何代码?

2 个答案:

答案 0 :(得分:1)

这里有很多问题,但至少你需要:

  • 虚拟类型(需要至少有1个虚拟成员,例如析构函数)
  • 除非您静态了解类型,否则请使用dynamic_cast。您可以让它抛出异常(在reference-cast上)或返回nullptr(在指针强制转换上)

答案 1 :(得分:0)

您正在参与大量不必要的演员/新/删除体操,这让我对您实际使用的数据结构感到疑惑。

多态性要求您拥有存储指向对象的指针的容器,而不是对象本身(因为对象可以是不同的大小)。我希望你这样做,否则你就会得到对象切片。

一旦你排序了,凌乱的代码就会变成这个。

for (Transform *t : gameObjects)
{  
    if (t->type == TYPE_MESH)
    {
       Cube* cube = dynamic_cast<Cube*>(t);
       if (cube)
          cube->Update();
    }
    ...

此外,if (t->Type == ..)有点代码味道。你不能使用动态强制转换来确定对象类型吗?