建構函式不能宣告為虛函式,析構函式可以宣告為虛函式,而且有時是必須宣告為虛函式。
不建議在建構函式和析構函式裡面呼叫虛函式。建構函式不能宣告為虛函式的原因是:
1 構造乙個物件的時候,必須知道物件的實際型別,而虛函式行為是在執行期間確定實際型別的。而在構造乙個物件時,由於物件還未構造成功。編譯器無法知道物件 的實際型別,是該類本身,還是該類的乙個派生類,或是更深層次的派生類。無法確定。
2 虛函式的執行依賴於虛函式表。而虛函式表在建構函式中進行初始化工作,即初始化vptr,讓他指向正確的虛函式表。而在構造物件期間,虛函式表還沒有被初 始化,將無法進行。虛函式的意思就是開啟動態繫結,程式會根據物件的動態型別來選擇要呼叫的方法。然而在建構函式執行的時候,這個物件的動態型別還不完整,沒有辦法確定它到底是什麼型別,故建構函式不能動態繫結。(動態繫結是根據物件的動態型別而不是函式名,在呼叫建構函式之前,這個物件根本就不存在,它怎麼動態繫結?)編譯器在呼叫基類的建構函式的時候並不知道你要構造的是乙個基類的物件還是乙個派生類的物件。
析構函式設為虛函式的作用: 解釋:在類的繼承中,如果有基類指標指向派生類,那麼用基類指標delete時,如果不定義成虛函式,派生類中派生的那部分無法析構。
為什麼c++預設的析構函式不是虛函式?
c++預設的析構函式不是虛函式是因為虛函式需要額外的虛函式表和虛表指標,占用額外的記憶體。而對於不會被繼承的類來說,其析構函式如果是虛函式,就會浪費記憶體。因此c++預設的析構函式不是虛函式,而是只有當需要當作父類時,設定為虛函式。
建構函式不能宣告為虛函式
建構函式不能宣告為虛函式的原因 1.所謂虛函式就是多型情況下只執行乙個,而從繼承的概念來講,總是先構造父類物件,然後才能使子類物件,如果建構函式設為虛函式,那麼你在構造父類的建構函式時就不得不顯式的呼叫構造,還有乙個原因就是為了防錯誤的發生,試想如果你在子類中一不小心重寫了個跟父類建構函式一樣的函式...
哪些函式不能被宣告為虛函式
常見的不不能宣告為虛函式的有 普通函式 非成員函式 靜態成員函式 內聯成員函式 建構函式 友元函式。1 為什麼c 不支援普通函式為虛函式?普通函式 非成員函式 只能被overload,不能被override,宣告為虛函式也沒有什麼意思,因此編譯器會在編譯時邦定函式。2 為什麼c 不支援建構函式為虛函...
C 中不能宣告為虛函式的有哪些函式
常見的不不能宣告為虛函式的有 普通函式 非成員函式 靜態成員函式 內聯成員函式 建構函式 友元函式。1 為什麼c 不支援普通函式為虛函式?普通函式 非成員函式 只能被overload,不能被override,宣告為虛函式也沒有什麼意思,因此編譯器會在編譯時邦定函式。多型的執行期行為體現在虛函式上,虛...