我无法理解孙子(D)如何覆盖隐藏项(通过C :: f2(A&)方法(B :: f2(A))。
这是示例代码:
{{1}}
答案 0 :(得分:2)
B
的接口没有f2( A& )
,因此,如果编译器不进行隐式转换,则您的b->f2( a );
将无法编译。
但是由于B
的接口确实具有f2( A )
,所以编译器会将a
的{{1}}从类型A&
隐式转换为A
。因此,从f2( A )
的界面中选择了B
形式的函数。
由于您的D
覆盖了该功能,因此D
的功能最终被调用。
(* 1)对于这些情况下发生的确切情况,C ++顽固分子可能知道一个比“隐式转换”更具体的术语。但是我只是一个业余爱好者。
答案 1 :(得分:2)
为什么B类中的f2被D类中的f2覆盖
因为D::f2
具有相同的参数列表。具有相同名称和参数列表的函数(如果存在base中的虚函数)将覆盖base中的虚函数。
虚拟函数是否已被中间库中同名的另一个函数隐藏,对此没有影响。
标准(草稿)中的规则:
[class.virtual]
如果在类
vf
和类Base
中声明了虚拟成员函数Derived
,而该类直接或间接地从Base
派生,则成员函数{{1 }}声明与vf
相同的名称,参数类型列表([dcl.fct]),cv限定符和ref限定符(或不存在),然后Base::vf
覆盖Derived::vf
。
因此,可以得出结论,Base::vf
将覆盖D::f2
,因为它具有相同的参数列表。它不会覆盖B::f2
,因为参数列表不同。