为什么B类中的f2被D类中的f2覆盖

时间:2019-07-17 16:21:06

标签: c++ inheritance overriding virtual

我无法理解孙子(D)如何覆盖隐藏项(通过C :: f2(A&)方法(B :: f2(A))。

这是示例代码:

{{1}}

2 个答案:

答案 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,因为参数列表不同。