结论:缺省参数是在编译期决定的。
示例代码:
class classA
{
public:
classA(){}
~classA(){}
virtual void print(int val = 1)
{
cout<<"from classA "<<val <<endl;
}
};
class classB: public classA
{
public:
classB(){}
~classB(){}
virtual void print(int val = 2)
{
cout<<"from classB "<<val <<endl;
}
};
int _tmain(int argc, _TCHAR* argv[])
{
classB b;
classA *pa = &b;
b.print();
pa->print();
classA a;
a.print();
return 0;
}
上述代码输出:
from classB 2
from classB 1
from classA 1
由于pa和b都是指向一个classB实例,因此运行时 会调用classB:print, 但缺省参数是在编译期决定的。
在编译时,pa被声明为classA类型的指针,因此会按照classA::print的声明把缺省参数设为1。
因此我们平时应该避免这种会导致意料之外的结果的写法,
《Effective C++》的第37条亦有论述:
绝不要重定义一个函数通过继承得到的缺省参数值。
本文探讨了C++中缺省参数在继承时的行为特点。通过示例代码展示了当子类重定义父类带有缺省参数的函数时可能出现的问题,并强调了在实际编程中应避免此类情况以防止产生意外结果。
7336

被折叠的 条评论
为什么被折叠?



