引子:
阿里的一道题:
#include <IOSTREAM> using namespace std; class A{ public: ) { cout<<"a~"<<val<<endl; } virtual void test() { func(); } }; class B: public A{ public: ) { cout<<"b~"<<val<<endl; } }; int main() { B *b = new B(); B c; b->test(); system("pause"); }
这里输出的答案是:b~0
在effective C++中,的条款37中说绝不重新定义继承而来的缺省参数值
virtual函数是动态绑定的,而缺省参数值却是静态绑定的。
调用一个定义于derived的虚函数的同时,却可能会使用base为他指定的缺省参数值。
这主要是为了保证运行效率,在编译(前期)的时候就已经给他静态的绑定了声明时的静态类型所给定的值。