两种绑定方式
静态绑定:在编译时刻,根据指针或引用变量的静态类型来决定成员函数属于哪一个类。
动态绑定:在运行时刻,根据指针或引用变量实际指向或引用的对象类型(动态类型)来确定成员函数属于哪一个类。
需要注意:
C++默认的绑定方式是静态绑定。示例如下:
#include<iostream> using namespace std;class bird{public:void fly(){cout<<"bird fly"<<endl;};//鸟会飞void walk(){cout<<"bird walk"<<endl;}//鸟会走};class penguin: public bird{public:void swim();//企鹅会游泳void fly(){cout<<"penguin can not fly"<<endl;}void walk(){cout<<"penguin walk"<<endl;}};void func1(bird&bd){bd.fly();}void func2(bird*pb){pb->fly();}int main(){bird bd;penguin pg;bd.fly();//bird::fly()func1(bd);//bird::fly()func2(&bd);//bird::fly()pg.fly();//penguin::fly()func1(pg);//bird::fly()func2(&pg);//bird::fly()return 0;}
必须在程序中显式地指出动态绑定。
动态绑定的实现
动态绑定的实现条件:
类的定义中成员函数声明为虚函数通过引用或指针来访问对象的虚函数
virtual声明需要注意:
一旦在基类中指定某成员函数为虚函数,那么,不管在派生类中是否给出virtual声明,派生类(以及派生类的派生类,…)中对其重定义的成员函数均为虚函数重定义: 对派生类中定义的成员函数, 其函数名, 参数个数和类型以及返回值类型与基类的某个虚成员函数相同(override)
动态绑定示例:
#include<iostream> using namespace std;class bird{public:virtual void fly(){cout<<"bird fly"<<endl;};//鸟会飞void walk(){cout<<"bird walk"<<endl;}//鸟会走};class penguin: public bird{public:void swim();//企鹅会游泳void fly(){cout<<"penguin can not fly"<<endl;}void walk(){cout<<"penguin walk"<<endl;}};void func1(bird&bd){bd.fly();}void func2(bird*pb){pb->fly();}int main(){bird bd;penguin pg;bd.fly();//bird::fly()func1(bd);//bird::fly()func2(&bd);//bird::fly()pg.fly();//penguin::fly()func1(pg);//penguin::fly()func2(&pg);//penguin::fly()getchar();return 0;}