gpt4 book ai didi

c++ - 所有继承自同一个类的对象映射,调用对象方法而不是父类; C++

转载 作者:塔克拉玛干 更新时间:2023-11-03 06:54:39 25 4
gpt4 key购买 nike

我有一个 Component类,这是父类,例如Sprite类(class)。 Sprite也有各种动画的children,但这不是本题的重点。我还有一个组件管理器,其中包含 map<string, Component> .我将我创建的每个组件存储在这张 map 中。目前有12种组件,以后会增加。

我的 Component类有virtual void draw()update()功能,与Sprite相同在这种情况下。但是,当我遍历组件映射时,它只调用 Component draw()update() .

我还没有真正找到对我有用的答案。

最佳答案

您正在经历 object slicing —因为你的map仅商店 Component对象按值,这些对象不包含 Component 提供的任何信息子类。一般来说,子类型多态性只能通过指针类型起作用,而不能通过值类型起作用。所以你需要通过指针存储实例,最好是std::map<std::string, std::unique_ptr<Component>> :

components["example"] = std::unique_ptr<Component>(new Example());

如果您使用的是非 C++11 编译器,请使用 std::map<std::string, Component*> :

components["example"] = new Example();

并确保您 delete Component清理期间的对象,例如,在组件管理器的析构函数中。 C++03:

for (std::map<std::string, Component*>::const_iterator i = components.begin();
i != components.end(); ++i)
delete i->second;

C++11:

for (const auto& i : components)
delete i.second;

关于c++ - 所有继承自同一个类的对象映射,调用对象方法而不是父类; C++,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11748661/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com