子类删除基类的operator[]后,整数参数的operator[]为何无法使用?
问题原因分析:子类删除重载运算符导致基类同名运算符被隐藏
核心原因:C++名字查找规则触发基类重载隐藏
在C++中,当子类声明了与基类**同名的函数(包括运算符重载)**时,基类的所有同名重载函数都会被隐藏——不管参数列表是否一致。
回到你的代码:
子类IntChild中声明了Base& operator[](const char* index) = delete;,这触发了名字隐藏规则:当你调用test[4]时,编译器会优先在IntChild的作用域内查找operator[],一旦找到同名的运算符(哪怕参数不匹配),就会停止向基类Base查找其他重载版本。
此时编译器只看到子类中那个被删除的、接受const char*参数的operator[],它无法匹配你传入的int类型参数4,因此抛出“no operator [] matches these operands”的错误,完全不会去考虑基类中存在的operator[](int)版本。
解决方法:用using声明引入基类的重载
如果你想保留基类的operator[](int),同时删除const char*版本,可以在子类中通过using声明将基类的所有operator[]重载引入子类作用域,再删除不需要的版本:
class IntChild : public Base { public: using Base::operator[]; // 引入基类所有operator[]重载 Base& operator[](const char* index) = delete; // 删除指定版本 };
这样编译器查找operator[]时,会同时看到基类的int版本和子类中被删除的const char*版本,调用test[4]时就能正确匹配基类的operator[](int)。
内容的提问来源于stack exchange,提问作者rkgghz
相关产品推荐
相关产品推荐

