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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 03:06:03