問題:是不是虛函式的呼叫就一定是動態系結?不是的
1:在類的建構式當中,呼叫虛函式,也是靜態系結(建構式中對虛函式的呼叫不發生動態系結)
2:如果不是通過指標或者參考變數來呼叫虛函式,那就是靜態系結
代碼1
class Base
{
public:
Base(int data=https://www.cnblogs.com/erichome/archive/2022/11/28/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=https://www.cnblogs.com/erichome/archive/2022/11/28/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;
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/538597.html
標籤:其他
