gpt4 book ai didi

没有指针的 C++ 多态性

转载 作者:IT老高 更新时间:2023-10-28 12:45:32 25 4
gpt4 key购买 nike

假设我有一个基类 Animal带有虚函数和一些派生类( CatDog 等)。真正的派生类包含 4-8 个字节的数据。我想存储一个 std::list<Animal>它实际上包含派生对象的项目。我想避免使用 new 在堆上创建许多小对象。

是否有任何设计模式可以用来实现这一点?

编辑:我的想法来实现这个

  1. 创建 std::deque<Cat> , std::deque<Dog> , ...;店铺 std::list<Animal*>其中包含来自 deques 的指针;我使用 std::deque因为我认为它对对象 block 具有良好的内存管理;

最佳答案

最终,不会。

多态性仅适用于非值类型:引用和指针。而且由于引用只能绑定(bind)一次,因此您不能真正在标准容器中使用它们。这给你留下了指针。

你在错误的地方解决问题。如果您担心分配大量小对象的开销(我假设这是一个合理的问题。也就是说,您有实际的分析数据或足够的经验来知道这是一个问题对于您的特定应用程序),那么您应该修复那个。更改为这些对象分配内存的方式。做一个小的分配堆什么的。

诚然,C++0x 之前的分配器在这方面有些欠缺,因为它们必须是无状态的。但是为了你的目的,你应该能够处理它。


来自您的编辑:

这是一个 可怕的想法。从 anywherestd::deque 删除,但开始或结束将使 std::list every 指针无效.

鉴于您的评论,这个想法是可行的。然而,为不同类型的对象拥有所有这些不同的内存块似乎违背了继承的全部要点。毕竟,你不能只写一个新类型的Animal,然后把它塞进std::list;你必须为其提供内存管理。

您确定这里需要基于继承的多态性吗?您确定其他一些方法不会同样有效吗?

关于没有指针的 C++ 多态性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7223613/

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