關於建構函式 析構函式和虛函式的關係

2021-06-08 05:18:49 字數 1958 閱讀 8034

建構函式不能宣告為虛函式的原因是:

解釋一:所謂虛函式就是多型情況下只執行乙個,而從繼承的概念來講,總是要先構造父類物件,然後才能是子類物件,如果建構函式設為虛函式,那麼當你在構造父類的建構函式時就不得不顯示的呼叫構造,還有乙個原因就是為了防錯,試想如果你在子類中一不小心重寫了個跟父類建構函式一樣的函式,那麼你的父類的建構函式將被覆蓋,也即不能完成父類的構造.就會出錯.

解釋二:虛函式的主要意義在於被派生類繼承從而產生多型.   派生類的建構函式中,   編譯器會加入構造基類的**,   如果基類的建構函式用到引數,   則派生類在其建構函式的初始化列表中必須為基類給出引數,   就是這個原因.

最近有人問建構函式能不能是虛函式: 當然不能 解釋一下: 1,從儲存空間角度 虛函式對應乙個vtable,這大家都知道,可是這個vtable其實是儲存在物件的記憶體空間的。問題出來了,如果建構函式是虛的,就需要通過 vtable來呼叫,可是物件還沒有例項化,也就是記憶體空間還沒有,怎麼找vtable呢?所以建構函式不能是虛函式。 2,從使用角度 虛函式主要用於在資訊不全的情況下,能使過載的函式得到對應的呼叫。建構函式本身就是要初始化例項,那使用虛函式也沒有實際意義呀。所以建構函式沒有必要是虛函式。 =: 虛函式的作用在於通過父類的指標或者引用來呼叫它的時候能夠變成呼叫子類的那個成員函式。而建構函式是在建立物件時自動呼叫的,不可能通過父類的指標或者引用去呼叫,因此也就規定建構函式不能是虛函式。 三. 建構函式不需要是虛函式,也不允許是虛函式,因為建立乙個物件時我們總是要明確指定物件的型別,儘管我們可能通過實驗室的基類的指標或引用去訪問它 但析構卻不一定,我們往往通過基類的指標來銷毀物件。這時候如果析構函式不是虛函式,就不能正確識別物件型別從而不能正確呼叫析構函式。四: 從實現上看,vbtl在構造函式呼叫後才建立,因而建構函式不可能成為虛函式 從實際含義上看,在呼叫建構函式時還不能確定物件的真實型別(因為子類會調父類的建構函式);而且建構函式的作用是提供初始化,在物件生命期只執行一次,不是物件的動態行為,也沒有太大的必要成為虛函式 五: 當乙個建構函式被呼叫時,它做的首要的事情之一是初始化它的v p t r。因此,它只能知道它是「當前」類的,而完全忽視這個物件後面是否還有繼承者。 當編譯器為這個建構函式產生**時,它是為這個類的建構函式產生**- -既不是為基類,也不是為它的派生類(因為類不知道誰繼承它)。 所以它使用的v p t r必須是對於這個類的v ta b l e。而且,只要它是最後的構造函式呼叫,那麼在這個物件的生命期內, v p t r將 保持被初始化為指向這個v ta b l e。但如果接著還有乙個更晚派生的建構函式被呼叫,這個建構函式又將設定v p t r指向它的 v ta b l e,等.直到最後的建構函式結束。v p t r的狀態是由被最後呼叫的建構函式確定的。這就是為什麼構造函式呼叫是從基類到更加派生 類順序的另乙個理由。 但是,當這一系列構造函式呼叫正發生時,每個建構函式都已經設定v p t r指向它自己的 v ta b l e。如果函式呼叫使用虛機制,它將只產生通過它自己的v ta b l e的呼叫,而不是最後的v ta b l e(所有建構函式被 呼叫後才會有最後的v ta b l e)。

析構函式設為虛函式的作用:    

解釋:在類的繼承中,如果有基類指標指向派生類,那麼用基類指標delete時,如果不定義成虛函式,派生類中派生的那部分無法析構。

#include   "stdafx.h"  

#include   "stdio.h"  

class   a      

;  

a::a()  

a::~a()  

class   b   :   public   a      

;  

b::b()  

b::~b()  

int   main(int   argc,   char*   argv)  

輸出結果為:delete   class   b        

delete   class   a  

如果把a   的virtual   去掉:  

那就變成了delete   class   a

建構函式 析構函式 虛析構函式

說析構函式之前,先說下建構函式。建構函式用來完成對物件的一系列初始化操作,主要作用有 1.給建立的物件建立乙個識別符號 2.為物件資料成員開闢記憶體空間 3.完成物件資料成員的初始化 當並未顯示的定義建構函式時,會生成乙個預設的建構函式,預設建構函式不能完成物件資料成員的初始化,只能給物件建立一識別...

建構函式 析構函式 虛函式

在類中,建構函式用於初始化物件及相關操作。建構函式是不能宣告為虛函式的,因為虛函式對應乙個virtual table 虛函式表 這個表的位址是儲存在物件的記憶體空間的。而在執行建構函式前,物件尚未完成建立,記憶體都沒有被分配,所以無法去查詢虛函式表,它不存在,因此也就無法得知該呼叫哪乙個函式了。析構...

C 建構函式 析構函式 虛析構函式

一般地,建立物件和刪除物件時,父類建構函式 子類建構函式 子類析構函式 父類析構函式。特例 如果用new建立了乙個物件,並將父類的指標指向這個子類的物件,那麼用delete撤銷物件時,系統只執行基類的析構函式,而不執行派生類的析構函式。如果希望按照子類析構函式 父類析構函式的順序執行,那麼應該將基類...