<六>关于虚函数和动态绑定
问题:是不是虚函数的调用就一定是动态绑定?不是的
1:在类的构造函数当中,调用虚函数,也是静态绑定(构造函数中对虚函数的调用不发生动态绑定)
2:如果不是通过指针或者引用变量来调用虚函数,那就是静态绑定
代码1
class Base
{
public:
Base(int data=10):ma(data){
cout<<"Base()"<<endl;
}
//虚函数
virtual void show(){cout<<"Base Show()"<<endl;}
//虚函数
virtual void show(int){cout<<"Base Show(int)"<<endl;}
~Base(){cout<<"~Base()"<<endl;}
protected:
int ma;
};
class Derive : public Base
{
public:
Derive(int data=20):Base(data),mb(data){
cout<<"Derive()"<<endl;
}
void show(){cout<<"Derive Show()"<<endl;}
~Derive(){cout<<"~Derive()"<<endl;}
private:
int mb;
};
int main(){
Base b(10);
Derive d(20);
b.show();//通过对象调用,静态绑定,不发生多态
d.show();//通过对象调用,静态绑定,不发生多态
//想一想为什么? b.show()如果发生动态绑定,b访问自己的虚函数表,自己虚函数表的show方法是自己Base的void show()方法的方法地址
//d.show() 如果发生动态绑定,d访问自己的虚函数表,自己虚函数表的show方法是自己Derive的void show()的方法地址
//访问的都是属于自己的函数地址,没有必要去走动态绑定机制
//动态绑定,必须通过指针调用虚函数,因为指针本身自己不知道自己指向了什么,所以要调什么方法就必须通过动态绑定来定位最终调用什么方法,这才有意义
Base *pb=&b;
Base *pb=&d;
pb->show();//发生动态绑定
pb->show();//发生动态绑定
//动态绑定,必须通过引用调用虚函数
Base &rb1=b;
rb1.show();//发生动态绑定
Base &rd1=d;
rd1.show();//发生动态绑定
return 0;
}