静态绑定:在编译过程中绑定(简单说就是决定使用那个函数)
动态绑定:编译器无法在编译过程中完成绑定,必须在程序运行时才能选择;动态绑定条件:
- 成员函数指定为虚函数。
- 必须通过基类类型的指针或者引用进行函数的调用。
#include <iostream>
using namespace std;
class base{
public:
virtual void disp(){cout<<"hello base1"<<endl;}//声明虚函数只要在基类成员函数前加上关键字virtual,在派生类前加不加无所谓
void disp2(){cout<<"hello base2"<<endl;}
};
class child : public base{
public:
void disp(){cout<<"hello child1"<<endl;}
void disp2(){cout<<"hello child2"<<endl;}
};
int main()
{
base* base = NULL;
child obj_child;
base = &obj_child;
base->disp();
base->disp2();
return 0;
}
运行结果:
hello child1
hello base2
结论:通过指针访问函数时:
- 加virtual时,具体调用哪个版本的函数不在取决于指针本身的类型,而是取决于指针所指对象的类型。
- 不加virtual时,具体调用哪个版本的函数只于指针本身的类型有关,和指针所指对象的类型无关。