下面, 我们来看一个简单但容易出错的题目:
#include<iostream>
using namespace std;
class A
{
public:
virtual void fun(int n = 1)
{
cout << "A--->" << n << endl;
}
};
class B : public A
{
public:
virtual void fun(int n = 2)
{
cout << "B--->" << n << endl;
}
};
int main()
{
A *p;
B b;
p = &b;
p->fun();
return 0;
}
稍微懂一点C++多态的同学可能会认为答案是:B--->2, 其实答案是B--->1. 为什么呢?因为虽然虚函数是动态绑定的, 但缺省参数值确实静态绑定的。 所以, 为了避免引起上述的错误理解, C++大牛Scott Meyers在著名的Effective C++中说了如下的一句话:
Effective C++说:绝不重新定义继承而来的缺省参数值!
好了, 我就不更多班门弄斧了, 需要知道具体细节的朋友, 可以参考这本经典之作。