从父类数组返回子类 C++

Kes*_* V. 1 c++ arrays oop

class Component {
    // Code here
};

class TransformComponent : public Component {
    // Code here
};

class Entity:
    public:
        Component components[25];
        
        TransformComponent *getTransform() {
            for(int i = 0; i < 25; i++) {
                if(typeid(components[i]) == typeid(TransformComponent())) {return *(components + i);}
            }
        }
};
Run Code Online (Sandbox Code Playgroud)

我有一个组件数组,里面可以是“Component”的任何子类,例如“TransformComponent”。问题是,在编译时,计算机认为组件数组仅填充有“Component”对象。该函数应该返回一个“TransformComponent”,编译器将其视为错误,即使我返回的数组中的元素是 TransformComponent。有没有办法解决这个问题(最好是简单的)?

lor*_*rro 6

“我有一个组件数组,里面可以是“Component”的任何子类,例如“TransformComponent”。” - 这个说法是错误的。如果您有一个对象数组Component,那么在数组中的每个索引处,都恰好有一个Component- 类型化的对象,而不是后代。

如果您想存储多个(例如基础后代)类型,您有两个主要选择:

  • 使用(智能)指针的容器:std::vector<std::unique_ptr<Component>> components
  • 使用变体:std::vector<std::variant<Component, TransformComponent/*, ... other types*/> components>;