You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.20 20:13:14