C++子类同名方法即便参数类型不同为何会屏蔽父类方法?
问题解答
为什么父类参数不同的同名方法也会被屏蔽
这是C++标准明确定义的**名字隐藏(Name Hiding)**规则:编译器进行名字查找时,会从当前作用域逐层向上检索。只要在子类作用域内找到了匹配的名字,就会立即停止查找,不会再向上检索父类作用域的同名成员,不管该名字的参数列表是否和调用参数匹配。
你代码里子类B定义了getSize(size_t &i)方法后,编译器在B的作用域找到了getSize这个名字,就不会再去父类A里找另一个getSize(int &d)的重载版本,所以调用b.getSize(i)时只会匹配到子类的size_t&参数版本,自然会报类型不匹配的错误。你之前提到的“子类定义同名同参方法会屏蔽父类对应方法”的表述是准确的,而且这个规则的覆盖范围更广:只要同名,不管参数是否一致,都会屏蔽父类所有同名重载。
附加问题解决方案
可以实现,不需要修改main函数、不需要修改B类现有方法的实现逻辑、也不需要改方法名,只需要在B类的public作用域添加一行using声明即可:
class B : public A{ public: using A::getSize; // 新增这一行,引入父类所有getSize重载 void getSize(size_t &i) override{ i = 4; } };
using A::getSize的作用是将父类A中所有名为getSize的重载都引入到子类B的作用域中,编译器查找名字时就能同时看到两个重载版本,会正常执行重载决议,匹配和入参类型对应的方法,你原有的main函数代码不需要做任何修改就能正常运行。
内容的提问来源于stack exchange,提问作者Jakobimatrix
相关产品推荐
相关产品推荐

