MST

星途 面试题库

面试题:C++函数默认参数作用范围在复杂类继承体系中的表现

假设有如下C++类继承体系: ```cpp class Base { public: virtual void func(int a, int b = 10); }; class Derived : public Base { public: void func(int a); }; ``` 在 `main` 函数中创建 `Derived` 类对象 `d`,然后调用 `d.func(5);`,请详细分析函数调用过程以及默认参数在这个过程中的作用范围。如果将 `Derived` 类中的 `func` 函数改为 `void func(int a, int b = 20);`,情况又会如何变化?
35.4万 热度难度
编程语言C++

知识考点

AI 面试

面试题答案

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