虛函式的意義很簡單,就是動態繫結,從而完成多型。沒有太大的疑問。但是關於虛函式的使用,有兩種情況比較特殊,需要留意:建構函式和虛構函式。
在例項化乙個類時,會按照父類-成員變數-子類的建構函式依次呼叫建構函式,析構的時候,會按照相反的次序依次呼叫析構函式。
如果在建構函式/析構函式中呼叫虛函式,或者呼叫的一般成員函式(非虛函式)中呼叫了虛函式,情況會怎麼樣那?這種情況下,因為編譯器知道類是什麼型別,所以此時編譯器會根據當前類的型別來呼叫相應的虛函式,而不會產生多型,所以[color=red][size=large]在建構函式/虛構函式中呼叫(直接或間接)虛函式,其行為是可控的。[/size][/color]
話說,c++的坑還真是多啊。
附**:
#include
using namespace std;
class a
virtual void say()
void resay()
~a()
};class b:public a
void resay()
//~b(){}
};int main()
輸出:in a //a的建構函式中呼叫a的say
in b
in a //呼叫a的析構函式,也是呼叫a的say
C 建構函式 析構函式 虛析構函式
一般地,建立物件和刪除物件時,父類建構函式 子類建構函式 子類析構函式 父類析構函式。特例 如果用new建立了乙個物件,並將父類的指標指向這個子類的物件,那麼用delete撤銷物件時,系統只執行基類的析構函式,而不執行派生類的析構函式。如果希望按照子類析構函式 父類析構函式的順序執行,那麼應該將基類...
建構函式 析構函式 虛析構函式
說析構函式之前,先說下建構函式。建構函式用來完成對物件的一系列初始化操作,主要作用有 1.給建立的物件建立乙個識別符號 2.為物件資料成員開闢記憶體空間 3.完成物件資料成員的初始化 當並未顯示的定義建構函式時,會生成乙個預設的建構函式,預設建構函式不能完成物件資料成員的初始化,只能給物件建立一識別...
虛函式與建構函式 析構函式
虛函式是多型的基礎 ps多型是乙個介面多個實現 多型條件 1.繼承 2.虛函式 3.父類指標指向子類 include using namespace std class myclass virtual void go1 virtual void go2 class classx public myc...