C++继承中Overloading(重载)与Overriding(重写)判定问题
重写、重载与名字隐藏的概念辨析
首先先纠正你原有认知里的两处偏差:
- 重载(Overloading)的判定规则不包含返回值类型:只有在同一作用域下,函数名相同、参数列表(参数数量、类型、排列顺序)不同的同名函数才算重载。仅返回值不同的同名函数在C++、Java等主流面向对象语言中属于语法错误,也不属于合法重载。
- 重写(Overriding)仅发生在继承体系中,核心要求是派生类函数与基类的虚函数签名完全一致:参数列表必须完全相同,返回值仅允许为协变类型(比如基类返回基类指针,派生类返回派生类指针)才可存在差异,重写的核心作用是实现运行时多态。
你提到的幻灯片示例中,基类fa1()无参、返回值为void,派生类fa1(float)带float类型参数、返回值为float,这种情况既不属于重写,也不属于常规重载,符合C++等语言中「名字隐藏(Name Hiding)」的定义:
基类和派生类属于不同作用域,派生类中定义的同名函数fa1,会将基类中所有名为fa1的函数全部隐藏,派生类对象调用fa1时只会匹配派生类的版本,无法直接调用基类的无参fa1。如果要实现派生类对基类fa1的重载,需要在派生类中显式添加using 基类名::fa1;声明,将基类的fa1名称引入派生类作用域。
如果该幻灯片将该情况标注为Overriding,仅可能是内容错误,或者采用了非通用的、不严谨的自定义定义(将派生类出现同名函数统称为重写),这一表述不符合工业界通用的面向对象编程概念规范。
内容的提问来源于stack exchange,提问作者Ethan Brown
相关产品推荐
相关产品推荐

