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

C++ vector存储子类对象时调用父类重载运算符比较排序问题

解决方案

你既不需要重载[]运算符,也不需要修改compare()的参数类型,现有代码的核心问题是Vecsort函数的设计逻辑错误,没有调用内部vector的元素做比较,修正方案如下:

1. 核心问题说明

你当前写的Vecsort接收两个外部传入的a类对象作为参数,全程没有用到类c内部存储的vec成员,自然只能比较传入的固定参数,和你存在vector里的子类对象完全无关。
同时因为b是a的公有子类,const b&类型可以隐式转换为const a&,完全适配compare函数的入参要求,不需要修改compare的定义。

2. 修正代码实现

你可以直接用STL提供的std::sort完成排序,不需要自己手写排序逻辑,代码更稳定:

#include <algorithm>
// 类c内部的Vecsort实现,不需要额外入参
void c::Vecsort() {
    // 方案1:直接用你重载的operator<做默认排序
    std::sort(vec.begin(), vec.end());
    // 方案2:显式调用你自定义的compare函数排序
    // std::sort(vec.begin(), vec.end(), compare);
}

如果你一定要自己实现排序逻辑,参考冒泡排序写法:

void c::Vecsort() {
    int len = vec.size();
    for (int i = 0; i < len - 1; i++) {
        for (int j = 0; j < len - i - 1; j++) {
            // 直接传入vector的两个元素到compare即可
            if (compare(vec[j], vec[j+1])) {
                swap(vec[j], vec[j+1]);
            }
        }
    }
}

3. 其他需要修正的语法/逻辑问题

  • 类a的compare函数存在笔误:变量名Al.name应为A1.name,访问的成员是names不是name,且函数外层缺了大括号
  • setVec函数存在对象切片风险:你当前入参是const a&,但vector存储的是b类型,直接push_back(A)会切割掉子类b的独有成员,如果不需要保留子类独有属性,可以把vec改为vector<a>类型,否则建议改用智能指针存储vector<std::unique_ptr<a>>避免切片
  • 所有类定义结束后需要加分号;,成员函数的实现末尾分号位置错误

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 20:45:02