C++默认实参静态绑定

来源:互联网 发布:oracle sql连接字符串 编辑:程序博客网 时间:2024/05/17 05:51

    C++中虚函数是动态绑定的(其它一般都是静态绑定的),但是如果其使用了默认实参,默认实参是静态绑定的。

    这意味着如果使用基类指针访问子类对象的虚函数,默认实参由基类确定(即这种场合在声明子类虚函数时给定不同默认实参是徒劳的)。


#include <iostream>using namespace std;class B{public:void show(){cout<<"B show"<<endl;}virtual void test(int i=5) //注意:默认实参编译时确定{cout<<"B test i="<<i<<endl;}};class C: public B{public:virtual void test(double i){cout<<"C test i="<<i<<endl;}virtual void test(int i = 20) //注意:默认实参编译时确定{cout<<"C test i="<<i<<endl;}void show(){cout<<"C show"<<endl;}};int main(){C *pc = new C; //pc静态类型C*, 动态类型C*B *pb = pc; //pb静态类型B*, 动态类型C*pc->show();//show非虚函数,直接调用指针所指类型函数(属于隐藏,其实不用定义直接继承B的show也可用)pb->show();//show是非虚函数,直接调用指针所指类型函数pb->test();//test是虚函数,查看所指对象类型,pb所指类型与对象类型不一致,再看是否重写test,如重写调用对象函数,否则调所指类型函数(多态)pc->test();//test是虚函数,查看所指对象类型,pc所指类型与对象类型一致,调用所指类型函数;return 0;}

运行结果:



0 0
原创粉丝点击