在C++中,函数的重写(Override)、重载(Overload)和隐藏(Hiding) 是三种不同的函数特性,它们的区别和应用场景如下:
1. 函数重载(Overload)
定义
在同一作用域内,多个函数使用相同的函数名,但参数列表不同(类型、数量或顺序不同)。
返回值类型可以不同,但仅返回值不同不足以构成重载。
特点
编译时根据参数列表决定调用哪个函数。
作用域必须相同(例如在同一个类或全局作用域)。
2. 函数重写(Override)
定义
在继承关系中,子类重新定义父类的虚函数(使用 virtual 关键字),要求函数名、参数列表和返回类型完全相同。
通过基类指针或引用调用时,实际执行的是子类的函数(多态性)。
特点
必须使用 virtual 关键字声明基类函数。
动态绑定(运行时多态)。
3. 函数隐藏(Hiding)
定义
子类定义了与父类同名的函数(无需相同参数列表),导致父类的同名函数在子类作用域中被隐藏。
即使参数列表不同,父类函数也会被隐藏。
若要调用父类函数,需显式指定作用域(如 Base::func())。
特点
隐藏发生在不同作用域(基类 vs 子类)。
静态绑定(编译时决定调用哪个函数)。
总结
常见问题
1、如何区分隐藏和重载?
隐藏发生在基类和子类之间,重载在同一作用域内。
2、若子类函数参数与父类不同,是否构成重载?
不会!父类函数会被隐藏,必须显式指定作用域调用。
3、重写时是否必须加 override 关键字?
C++11 引入 override 关键字,非强制但建议使用,可帮助编译器检查是否满足重写条件。