发布时间:2022-11-28 文章分类:编程知识 投稿人:赵颖 字号: 默认 | | 超大 打印

问题:是不是虚函数的调用就一定是动态绑定?不是的
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; 
}