虚函数实现机制(关于虚函数和动态绑定)
导读:问题:是不是虚函数的调用就一定是动态绑定?不是的...
问题:是不是虚函数的调用就一定是动态绑定?不是的
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; }创心域SEO版权声明:以上内容作者已申请原创保护,未经允许不得转载,侵权必究!授权事宜、对本内容有异议或投诉,敬请联系网站管理员,我们将尽快回复您,谢谢合作!