c++ - 不能使用 dynamic_cast 从 Base 转换为 Derived

标签 c++ polymorphism game-engine dynamic-cast

当我尝试将基类转换为派生类时出现错误。 我想访问我放在我的组件 vector 中的派生类。

//基础和派生

class Component
{
public:
    Component();
    virtual ~Component();
private:
};

class Material:public Component{...};

//主要内容

int textureID = gameScene.gameObjects[0].getComponent<Material>()->texture;

//游戏对象

#pragma once
#include <vector>
#include "Component.h"

class GameObject:public Component
{
public:
    GameObject();
    GameObject(int otherAssetID);
    ~GameObject();

    int assetID;
    std::vector<Component> components;

    void addComponent(Component otherComponent);
    void deleteComponent(Component otherComponent);

    template <class T>
    T* getComponent() {
        for (int i = 0; i < components.size(); i++)
        {
            if (dynamic_cast<T*>(components[i]) != nullptr)
            {
                T *test = dynamic_cast<T*>(components[i]);
                return test;
            }
        }

        return nullptr;
    }
private:

};

最佳答案

std::vector<Component>不能包含 Component 以外的类对象本身。如果您添加 Material vector 的对象,Component Material 的一部分将被存储。这个问题被称为 object slicing problem .

您可能想要制作一个 vector ,其中包含指向基本多态类的指针。

::std::vector<::std::unique_ptr<Componenet>> components;

还有dynamic_cast很昂贵,因此您可能只想在存储返回值后调用它:

 T * const test = dynamic_cast<T*>(components[i].get());
 if(test)
 {
     return test;
 }

关于c++ - 不能使用 dynamic_cast 从 Base 转换为 Derived,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48290103/

相关文章:

c - 我无法让顶点围绕玩家正确旋转

c++ - Vulkan 中动态统一缓冲区的缓冲区内存分配

c++ - const 关键字的默认数据类型是 int 类型?

c++ - 为什么在使用 PIMPL 习语时这种类型不完整?

c++ - 复制对象——保持多态性

c++ - 模板方法的接口(interface)

Java自定义像素渲染引擎bug

c++ - 将 boost::thread 与 C++11 std::mutex 混合使用是否安全?

c++ - 将 vector<string> 转换为 vector<double> 的便捷方法

java - 接受两种不同类型作为参数的方法