虚函数继承的默认缺省参数

永远不要重新定义虚函数继承的默认缺省参数,因为虚函数具有动态绑定特性但是默认缺省参数却具有静态绑定特性。

如果重新定义了默认参数,就会出现混乱,比如下面程序:

#include<iostream>
using namespace std;
class Animal {
	public:
		virtual void getClass(char* type="animal") {
			cout<<type<<endl;
			cout<<"base"<<endl;
		}
};
class Tiger:public Animal{
	public:
		void getClass(char* type="tiger") {
			cout<<type<<endl;
			cout<<"derived"<<endl;
		}
};
int main() {
	Tiger tiger;
	Animal* animal=&tiger;
	animal->getClass();
}


可以看到默认形参为基类中虚函数的默认参数,然而执行的确实派生类的虚函数,这就让人很费解。所以永远不要重新定义默认参数值。

为什么C++中默认参数采用静态绑定,而不采用动态绑定呢?

和运行效率有关,因为默认参数采用动态绑定,那么虚函数运行时,编译器就要确定缺省的参数值,这比在编译阶段确定默认缺省参数的机制更加复杂。为了提高运行的效率和实现的简便,默认缺省参数采用静态绑定。

你可能感兴趣的:(虚函数继承的默认缺省参数)