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

继承std::vector的类引入基类构造后派生类构造未被调用问题

该现象的核心原因是C++的继承构造函数规则和重载决议匹配优先级共同作用的结果,具体逻辑如下:
  • using vector<T>::vector的作用是将基类std::vector的所有构造函数,全部引入派生类Vector的构造函数重载候选集合,参与调用时的匹配选择。
  • 你在main函数中传入的参数{1,2,3,4,5}是std::initializer_list<int>类型的临时对象:
    • 从基类引入的构造函数中,包含直接接收std::initializer_list<T>参数的版本,属于精确匹配,匹配优先级最高。
    • 你自行实现的派生类构造函数接收的是vector<T>类型参数,std::initializer_list<int>到vector<int>需要经过一次用户定义的隐式转换,匹配优先级更低。
  • 编译器在做重载决议时会优先选择匹配等级更高的候选,因此加了using语句时,会直接调用继承来的基类构造函数,不会触发你自行实现的派生类构造函数。
  • 去掉using语句后,派生类的构造函数候选集合只有你自行实现的版本,编译器会先将std::initializer_list<int>隐式转换为vector<int>,再调用你实现的构造函数,因此行为符合预期。

额外注意事项

  • 标准库的std::vector没有定义虚析构函数,不适合被公开继承,派生类对象通过基类指针销毁时会触发未定义行为。
  • 你当前的派生类同时继承了vector<T>又额外定义了一个vector<T> x成员,属于冗余设计,会占用双倍存储空间,不符合继承的使用逻辑。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 03:51:04