继承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
相关产品推荐
相关产品推荐

