C++派生类const char*参数的contains方法为何隐藏基类同名方法
C++派生类同名方法隐藏问题成因
这是C++标准规定的**名称隐藏(name hiding)**规则导致的,核心逻辑和作用域的查找顺序有关:
- C++的重载决议只会针对同一作用域下的同名函数生效。派生类是独立于基类的作用域,当编译器在派生类作用域内查找到
contains这个名称后,就会立刻停止向上层(基类)作用域的查找,不管基类的同名方法参数列表是否匹配,都会被直接排除在重载候选集之外。 - 你的场景中,派生类定义的
bool contains(const char *str) const已经把基类的bool contains(const T& val) const(此时T是char,也就是const char&参数版本)完全隐藏了。调用contains('x')时,编译器仅能看到派生类的const char*参数版本,'x'是char类型,无法合法隐式转换为const char*,因此直接编译失败。
如果需要让基类的同名重载也参与匹配,只需要在派生类中用using声明引入基类的contains即可:
class Derived : public MyVector<char> { public: // 将基类所有contains重载引入派生类作用域 using MyVector<char>::contains; bool contains(const char *str) const { // 原有实现 } };
添加上述声明后,基类和派生类的contains方法会共同参与重载决议,调用contains('x')就会正确匹配到基类的const char&参数版本。
内容的提问来源于stack exchange,提问作者Ella
相关产品推荐
相关产品推荐

