浅谈c++静态绑定、动态绑定
多態:指同一個實體同時具有多種形式,即一個名字可以具有多種語義。函數重載、類模板、函數模板等都屬于多態性。通俗來說就是接口的多種不同實現方式。
函數綁定:就是函數的入口地址同函數調用相聯系的過程。
分為靜態綁定和動態綁定。
兩者的區別:靜態綁定在程序執行前完成,由編譯系統或操作系統裝入程序計算函數的入口地址;而動態綁定則在執行過程中完成,由程序自身計算函數的入口地址。
靜態綁定:在編譯階段決定執行哪個同名的被調用函數。
//靜態綁定 #include<iostream> #include<stdlib.h> using?namespace?std; class?student? { public:void?calfee(){_fee1?=?1000;}void?print(){cout<<_fee1<<endl; } protected:int?_fee1; }; class?Graduate:public?student { public:void?calfee(){_fee1?=?2000;}void?print(){cout<<_fee1<<endl; }}; void?fn(student?&x) {x.calfee();x.print(); }int?main() {student?s1;Graduate?g1;fn(s1);fn(g1);system("pause");return?0; }結果: 1000 1000動態綁定:是由編譯系統自動生成的、靜態或動態連接的、程序自身激活并執行的過程。在編譯階段不能決定執行哪個同名被調用函數,只在執行階段才能依據要處理的對象類型來決定執行哪個類的成員函數。
所以要實現動態綁定需要用到虛函數,虛函數是動態綁定的基礎。?
下面分析一下虛函數
虛函數:也是類的一種成員函數,并且不能是靜態成員函數。
虛函數的作用是實現動態綁定,也就是在程序的運行階段動態的選擇合適的成員函數。從而實現多態性
設置虛函數的一寫注意事項:
1、只有類的成員函數才能聲明為虛函數。因為虛函數只適用于有繼承關系的類對象,所以普通函數不能聲明為虛函數。
2、靜態成員不能是虛函數,因為靜態成員不受限于某個對象。
3、內聯函數不能是虛函數,因為內聯函數不能在運行中歐諾個動態的確定其位置。即使虛函數在類的內部定義,編譯時仍將其看做是非內聯的。
4、構造函數不能是虛函數,因為構造時對象還是一片未定型的空間。只有在構造完成后,對象才能成為一個類的名副其實的實例。
5、析構函數可以是虛函數,而且通常聲明為虛函數。目的在于:使用delete刪除一個對象時,確保析構函數能夠被正確運行。因為設置虛析構函數后,可以利用動態綁定方式選擇析構函數。
下面程序演示了析構函數在有些情況下必須設置為虛函數
class?A { public:A(){cout<<"A()"<<endl;}virtual?~A(){cout<<"~A()"<<endl;} }; class?B:public?A { private?:char?*_buf; public:B(int?i){_buf?=?new?char[i];cout<<"B()"<<endl;}virtual?~B(){delete[]?_buf;cout<<"~B()"<<endl;} }; void?fun(A*?pa) {delete?pa; } int?main() {A?*pa?=?new?B(10);fun(pa);system("pause");return?0; } 結果: A() B() ~B() ~A() 如果將~A()不定義為虛函數,則結果為:~A()純虛函數:無函數體的一種特殊的虛函數。
其聲明的格式為:virtual 類型 函數名(參數表)= 0;
抽象類:至少有一個純虛函數的類。
作用:將有關類組織在一個繼承層次結構中,由它提供一個公共的根,相關的子類都是從這個根派生出來的。
抽象類的使用規定:
1、抽象類只能用作其他類的基類,不能建立抽象類對象。
2、抽象類不能用作參數類型、函數返回類型或顯示轉換類型
3、可以定義抽象類的指針和引用,此指針可以指向它的派生類,從而實現多態。
class?A?//抽象類 { public:A(){cout<<"A()"<<endl;}virtual?~A(){cout<<"~A()"<<endl;}virtual?void?fun()=0; }; class?B:?public?A? {public:B(){cout<<"B()"<<endl;}virtual?~B(){cout<<"~B()"<<endl;}void?fun(){cout<<"B::fun()"<<endl;} }; class?C:?public?A? {public:C(){cout<<"C()"<<endl;}virtual?~C(){cout<<"~C()"<<endl;}void?fun(){cout<<"C::fun()"<<endl;} }; int?main() {A?*arr[2];B?b;C?c;arr[0]?=?&b;arr[0]->fun();arr[1]?=?&c;arr[1]->fun();system("pause");return?0; }轉載于:https://blog.51cto.com/fengbaoli/1771589
總結
以上是生活随笔為你收集整理的浅谈c++静态绑定、动态绑定的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【原创】为什么 Redis 重启后没有正
- 下一篇: s3c2440移植MQTT