面试题答案
一键面试- 原代码函数调用分析:
- 函数调用过程:
- 在C++中,当通过派生类对象调用虚函数时,会根据对象的实际类型来决定调用哪个版本的函数。这里创建了
Derived
类对象d
,调用d.func(5);
。由于func
在Base
类中声明为虚函数,所以会调用Derived
类中的func
函数。 Derived
类中的func
函数声明为void func(int a);
,它覆盖了Base
类中的虚函数void func(int a, int b = 10);
。但Derived
类的func
函数参数列表与Base
类的虚函数不完全相同(少了默认参数b
),这种情况下,Derived
类的func
函数只是隐藏了Base
类的func
函数,并非严格意义上的重写(重写要求函数签名完全一致)。
- 在C++中,当通过派生类对象调用虚函数时,会根据对象的实际类型来决定调用哪个版本的函数。这里创建了
- 默认参数作用范围:
- 因为调用的是
Derived
类的func
函数,而Derived
类的func
函数没有默认参数,所以Base
类中func
函数的默认参数b = 10
在这里不起作用。
- 因为调用的是
- 函数调用过程:
- 修改后代码函数调用分析(将
Derived
类中的func
函数改为void func(int a, int b = 20);
):- 函数调用过程:
- 此时
Derived
类中的func
函数void func(int a, int b = 20);
与Base
类中的虚函数void func(int a, int b = 10);
函数签名完全一致(函数名、参数列表都相同),Derived
类的func
函数构成对Base
类虚函数的重写。 - 当调用
d.func(5);
时,由于d
是Derived
类对象,会调用Derived
类中重写后的func
函数。
- 此时
- 默认参数作用范围:
- 因为调用的是
Derived
类的func
函数,所以会使用Derived
类中func
函数的默认参数b = 20
,而不是Base
类中func
函数的默认参数b = 10
。默认参数是静态绑定的,即根据调用对象的静态类型(在编译时确定)来选择默认参数,这里调用的是Derived
类的函数,所以使用Derived
类的默认参数。
- 因为调用的是
- 函数调用过程: