下面关于 C++ 类的说法中,正确的是( )?
这题考的是继承里最核心的「覆盖与隐藏」区别。拿到题先别急着背定义,直接盯着选项里的「参数」二字想:C++ 里同名函数到底什么时候算覆盖?什么时候只是把基类的给藏起来了?
学生最容易掉进两个坑:一是看到同名就以为一定覆盖,选了B;二是被A项里的「歧义」吓住,误以为C++禁止同名。其实歧义只发生在调用时没写作用域,定义阶段完全允许同名。真正的坑在于没分清「覆盖」和「隐藏」的触发条件——参数一致才覆盖,参数一变直接隐藏,这是很多初学者混淆的点。
【考点】类继承、成员函数覆盖、成员函数隐藏。很多考生一听到「覆盖」就以为只要同名就行,这是最大的误区。C++ 的继承机制其实非常严谨:派生类完全可以定义和基类同名的成员函数,但只有当参数列表完全一致时,才会发生真正的「覆盖」(override),此时基类的同名函数被派生类版本完全取代,虚函数的多态行为才会生效。如果参数不一致,哪怕只多一个参数,基类的那个同名函数不会被覆盖,而是被「隐藏」(hide),派生类里定义的是一个全新的函数,两者互不干扰,调用时得靠作用域限定符来区分。选项 A 错在「不能同名」是伪命题,C++ 允许同名,歧义仅出现在调用时未写作用域,而非定义阶段;选项 B 错在把「覆盖」泛化到所有同名函数,忽略了参数一致性这一必要条件;选项 D 更是离谱,派生类当然继承成员函数(构造函数除外)。只有 C 准确抓住了「参数是否一致」这个决定性因素。命题人喜欢在这里挖坑,就是利用考生对「覆盖」概念的模糊记忆,诱导选最像的 B。解题心法很简单:看到同名函数,先问自己「参数一致吗?」——一致则覆盖,不一致则隐藏。记住这个口诀,下次刷到这类题就能一眼看穿本质。