C++中如何正确过滤存储多态派生类的vector容器?
按派生类类型过滤vector的方法
在C++中,你可以使用dynamic_cast来判断并转换派生类对象,从而实现按类型过滤。因为你的Shape类包含纯虚函数(属于多态类型),dynamic_cast会在运行时检查对象的实际类型:转换成功则返回对应派生类的指针,失败则返回nullptr。
修改后的代码示例
#include <iostream> #include <vector> using namespace std; class Shape { public: virtual double getArea() = 0; virtual ~Shape() {} // 虚析构函数,避免内存泄漏 }; class Circle : public Shape { public: double getArea() { return 3.14; } // 可添加Circle特有的方法 void showCircleInfo() { cout << "这是一个圆,面积: " << getArea() << endl; } }; class Rectangle : public Shape { public: double getArea() { return 42.0; } }; int main() { vector<Shape*> shapes = {new Circle(), new Rectangle(), new Circle()}; // 过滤并操作所有Circle对象 for (Shape* s : shapes) { // 尝试将Shape*转换为Circle* if (Circle* circle = dynamic_cast<Circle*>(s)) { circle->showCircleInfo(); // 此处可执行任意Circle特有的操作 } } // 释放内存 for (Shape* s : shapes) { delete s; } shapes.clear(); return 0; }
关键点说明
dynamic_cast仅适用于多态类型(即包含至少一个虚函数的类),你的Shape类因纯虚函数getArea()满足该条件。- 若对象实际不是
Circle类型,dynamic_cast会返回nullptr,通过判断指针是否为空即可过滤出目标类型。 - 添加虚析构函数
virtual ~Shape() {},确保删除基类指针时能正确调用派生类析构函数,避免内存泄漏。
内容的提问来源于stack exchange,提问作者Max Wen
相关产品推荐
相关产品推荐

