1.1 建構函式時編譯器過程:(編譯器為每個含有虛函式的類都準備乙個vftable表)
(1)無父類無虛函式,直接呼叫本類建構函式執行**
(2)無父類有虛函式,有虛函式時將本類的vftable直接賦給this[this區域性變數就是棧位址,new就是malloc分配的位址]首位址,如果有初始化列表,在執行初始化列表進行賦值,最後在執行本類的建構函式內的**;
(3)有父類有虛函式,建構函式先呼叫直接父類的建構函式一層一層直到頂端父類,層層往上!最頂端父類如(1)(2)情況執行,再往派生類一步一步回退,回退時迴圈執行有虛函式時將本類的vftable直接賦給this[this區域性變數就是棧位址,new就是malloc分配的位址]首位址,如果有初始化列表,在執行初始化列表進行賦值,最後在執行本類的建構函式內的**,也是一層一層往下,直到回到本類中;
(4)有父類無虛函式,建構函式先呼叫直接父類的建構函式一層一層直到頂端父類,層層往上!最頂端父類如何(2)情況執行,再往派生類一步一步回退,回退時迴圈執行如果有初始化列表,在執行初始化列表進行賦值,最後在執行本類的建構函式內的**,也是一層一層往下,直到回到本類中;
1.2 new物件時
(1)先new分配物件的記憶體 呼叫malloc分配記憶體,大小根據本類所佔位元組數(內包含虛函式表指標);
(2)再呼叫本類的建構函式,無父類無虛函式【1.1(1)】 !無父類有虛函式【1.1(2)】;
(3)有父類有虛函式執**況如【1.1(3)】
1.3區域性物件時
(1)先區域性開闢記憶體,直接使用棧內分配的記憶體
(2)呼叫本類的建構函式,無父類無虛函式【1.1(1)】 !無父類有虛函式【1.1(2)】;
(3)有父類有虛函式執**況如【1.1(3)】
2.1 建構函式時編譯器過程:
(1)無父類無虛函式,直接呼叫本類析構函式執行**
(2)無父類有虛析函式,無父類就不需要分析虛析構了!(不重要)
(3)有父類有虛析函式,我們用父類指標指向子類物件時,當析構這個指標時,父類的析構函式是虛析構時,首先呼叫的是子類的析構函式,一層一層直至最頂層父類,正好和構造相反
(4)有父類無虛析函式, (這種情況很麻煩,也是大部分犯錯的根源!當我們用父類指標指向子類物件時,當析構這個指標時,父類的析構函式不是虛析構時,那麼此時只會呼叫父類析構函式而不會呼叫子類的析構函式,所以一般把父類的析構函式設定為虛析構函式);
2.2delete物件時 [父類指標指向子類物件時]
(1)先呼叫本類的析構函式,也會進行虛函式表賦給this首位址再執行本類析構函式的**,執行完後在呼叫直接父類的析構函式,層層進行直至頂層父類
2.3區域性物件和delete差不多,不分析
物件導向的多型性(c++)
1.依賴:形參、區域性變數
2.關聯:屬性
----2.1聚合 整體與部分 不一致的宣告週期
----2.2.組合 整體與部分 一致的宣告週期
3.繼承:父子之間關係
4.實現:介面與實現類關係
C 構造和析構
include using namespace std class b b b b b b int i data i b operator b b private int data b play b b int main output constructed by parameter 5 destr...
C 構造和析構
建構函式的作用是給類中的資料成員初始化,在乙個類物件產生的時候自動呼叫,建構函式分為帶參構造 無參構造。他倆唯一的區別就是乙個有引數,乙個沒引數,視實際情況使用 class cmyc cmyc cmyc cmyc cmyc int a,float b,char ch 它在乙個類物件被建立的時候自動呼...
C 構造和析構
1 繼承關係可認為,子類在父類的基礎上進行。從這個角度講,可把它認為穿衣 的過程。穿衣是 先穿內衣,再穿外套。是 先脫外套,在 構造是 先呼叫父類構造方法,再呼叫子類構造方法。析構是 先呼叫子類析構方法,再呼叫父類析構方法。2 構造可分為兩個步驟 初始化列表和方法內賦值。前者的使用場景是 初始化,即...