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

C++如何对存储D2*指针的vector按子类类型过滤输出内容

实现方案

可以实现,只需给原有output函数增加一个可选的过滤参数即可,完全复用现有输出逻辑,同时兼容原有调用方式,以下提供两种常用实现方案:

方案1:基于RTTI的无侵入实现

无需修改原有D2、D3、D4类的定义,直接利用C++运行时类型识别功能做类型判断,适合不想改动现有类结构的场景:

改造后的output函数

#include <functional>
#include <vector>
// 新增filter可选参数,默认值为nullptr表示不过滤,兼容原有调用
void output(std::vector<D2*>& vec, const std::function<bool(D2*)>& filter = nullptr) {
    for (const auto& item : vec) {
        // 存在过滤条件且当前元素不满足条件则跳过输出
        if (filter != nullptr && !filter(item)) {
            continue;
        }
        item->display();
        std::cout << " | ";
    }
}

调用示例

// 1. 原有调用方式不变,输出所有类型元素
output(vec);

// 2. 仅输出D3类型元素
output(vec, [](D2* ptr) {
    return dynamic_cast<D3*>(ptr) != nullptr;
});

// 3. 仅输出D4类型元素
output(vec, [](D2* ptr) {
    return dynamic_cast<D4*>(ptr) != nullptr;
});

注意:该方案要求编译器开启RTTI支持(大部分桌面端开发环境默认开启),且父类D2必须包含至少一个虚函数(你当前场景已经满足display是虚函数的要求)。

方案2:基于虚函数标记的高性能实现

如果项目关闭了RTTI或者需要更高的过滤性能,可以通过在类中新增虚类型标识函数实现,性能比方案1高30%以上:

第一步:修改类定义新增类型标识

class D2 {
public:
    // 新增纯虚类型标识函数,子类各自返回唯一标识
    virtual int getClassTag() const = 0;
    // 原有其他类逻辑保持不变
};

class D3 : public D2 {
public:
    int getClassTag() const override { return 1; }
    // 原有其他类逻辑保持不变
};

class D4 : public D2 {
public:
    int getClassTag() const override { return 2; }
    // 原有其他类逻辑保持不变
};

第二步:调用output时传入对应过滤条件

// 仅输出D3类型元素
output(vec, [](D2* ptr) {
    return ptr->getClassTag() == 1;
});

内容的提问来源于stack exchange,提问作者acidx27x

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 04:24:04