#include <iostream> using namespace std; class Base { public: virtual void Func1(uint32_t p = 100) { cout << p << endl; } void Func2(uint32_t p = 100) { cout << p << endl; } }; class Derive : public Base { public: void Func1(uint32_t p = 200) { cout << p << endl; } void Func2(uint32_t p = 200) { cout << p << endl; }; int main(void) { Base *d = new Derive(); d->Func1(); //因为基类和派生类函数参数不一样,所以不构成覆盖 d->Func2(); //基类中Func2没有virtual关键字,不构成覆盖 return 0; }
时间: 2024-04-08 19:31:24 浏览: 114
使用include <iostream>时一定要加using namespace std
在上述代码中,有两个函数`Func1()`和`Func2()`,分别位于基类`Base`和派生类`Derive`中。我们来逐个分析它们的特点和调用情况:
1. `Func1()`函数:
- 基类`Base`中的`Func1()`函数是虚函数,可以被派生类覆盖。
- 派生类`Derive`中的`Func1()`函数与基类中的函数具有相同的名称和参数类型,但有一个默认参数值不同。
- 在`main()`函数中,使用基类指针`d`指向派生类对象,并调用`d->Func1()`。
- 由于基类和派生类的函数参数不一样(派生类中有一个默认参数值为200),所以这里不构成覆盖。实际上调用的是基类中的`Func1()`函数,默认参数值为100。
2. `Func2()`函数:
- 基类`Base`中的`Func2()`函数没有使用虚函数关键字,不是虚函数,无法被派生类覆盖。
- 派生类`Derive`中的`Func2()`函数与基类中的函数具有相同的名称和参数类型,但有一个默认参数值不同。
- 在`main()`函数中,使用基类指针`d`指向派生类对象,并调用`d->Func2()`。
- 由于基类中的`Func2()`函数不是虚函数,不构成覆盖,实际上调用的是基类中的`Func2()`函数,默认参数值为100。
因此,执行上述代码的输出结果是:
```
100
100
```
需要注意的是,在派生类中重新定义虚函数时,最好避免改变函数的参数列表,以确保能正确覆盖基类的虚函数。默认参数值的不同并不影响函数的覆盖关系。
阅读全文