問題:是不是虛函數的調用就一定是動態綁定?不是的 1:在類的構造函數當中,調用虛函數,也是靜態綁定(構造函數中對虛函數的調用不發生動態綁定) 2:如果不是通過指針或者引用變數來調用虛函數,那就是靜態綁定 代碼1 class Base { public: Base(int data=10):ma(da ...
問題:是不是虛函數的調用就一定是動態綁定?不是的
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;
}