如何对存储抽象基类引用的泛型容器使用for each循环
问题原因
- C标准不允许
std::vector直接存储引用类型:引用本身不支持赋值操作(绑定后无法修改指向),且vector内部实现需要操作元素指针,Renderable&*这种指向引用的指针是C语法明确禁止的,这就是你遇到C2528报错的直接原因。 - 删掉
&用std::vector<Renderable>也不可行:抽象类包含纯虚函数,无法实例化,vector分配元素内存的时候需要构造基类实例,自然会报错;就算基类不是抽象类,直接存储基类实例也会发生对象切片,丢失派生类的多态属性,调用render()只会执行基类的实现,完全不符合需求。
正确实现方案
要保留多态特性,应该在vector里存储基类的指针,优先用智能指针避免手动内存管理的风险,示例如下:
#include <vector> #include <memory> // 基类定义补充虚析构函数,避免派生类销毁时内存泄漏 class Renderable { public: virtual void render() = 0 ; virtual ~Renderable() = default; }; // 容器定义改为存储智能指针 std::vector<std::unique_ptr<Renderable>> allRenderables; // 若实例需要被多处共享,可改用std::shared_ptr<Renderable> // 遍历调用逻辑几乎无需修改 for (auto& renderablePtr : allRenderables) { renderablePtr->render(); }
如果能确保所有Renderable派生类实例的生命周期都长于这个vector,也可以用裸指针std::vector<Renderable*>,但要注意规避悬空指针问题。
内容的提问来源于stack exchange,提问作者Minh To Quang
相关产品推荐
相关产品推荐

