有题目一道:
#include <iostream>
using namespace std;
class A1
{
public: virtual int f(int n = 5){ return 2*n; }
};
class B: public A1
{
public: int f(int n = 10) { return 3*n; }
};
int main()
{
A1 * p = new B();
cout<< p->f() <<endl;
return 0;
}
输出的结果为 15.
结果分析:
1、B中的函数int f(int)也为虚函数(与基类的函数原型完全一样),因此通过指针调用为动态绑定,即这里实际调用的是B中的f(int)。
2、虚函数的默认实参由调用该函数的类型决定,而与动态类型无关。这里通过基类指针调用,因此实参为基类中的默认实参5.
关于动态绑定:
1、必须通过指针或引用调用;
2、必须为虚函数。
两个条件必须同时满足,缺一不可。
派生类中的函数必须与基类的虚函数原型完全一样:函数名,参数列表完全一样,关键字virtual可有可无。
如果函数原型不完全一样,则将是新的函数,这时新的函数将覆盖掉继承的虚函数。