建構函式不能是虛函式的原因:
l 從概念上來說,如前所述,虛函式機制只有在應用於位址時才有效,因為位址在編譯階段提供的型別資訊不完全。建構函式的功能是為乙個物件在記憶體中分配空間,也就是說,此時該物件的型別已經確定了,編譯系統確切的知道應該呼叫哪乙個類的建構函式,不需要也不可能應用動態繫結。
l 從實現上來說,每個物件的vptr是需要建構函式來初始化的(當然是由編譯系統自動加進去的**來實現),在建構函式沒有呼叫之前,vptr沒有形成,根本就不可能實現動態繫結。
析構函式設為虛函式的作用:
解釋:在類的繼承中,如果有基類指標指向派生類,那麼用基類指標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
因此析構函式不宣告為虛函式容易造成記憶體洩漏。
析構函式宣告為虛函式
base pb inherit c inherit 是繼承 base的 pb c delete pb 時需要呼叫物件的析構函式,如果基類析構不是virtual型,會根據pb的定義型別呼叫相應類的析構函式,即呼叫即類析構,但如果你在派生類析構裡有記憶體釋放操作,那就會發生記憶體洩漏。假如基類析構是vi...
建構函式,析構函式能否宣告為虛函式
建構函式不能宣告為虛函式 析構函式可以宣告為虛函式,而且有時是必須宣告為虛函式 不建議在建構函式和析構函式裡面呼叫虛函式。建構函式不能宣告為虛函式的原因是 1 構造乙個物件的時候,必須知道物件的實際型別,而虛函式行為是在執行期間確定實際型別的。而在構造乙個物件時,由於物件還未構造成功。編譯器無法知道...
建構函式和析構函式能否宣告為虛函式?
建構函式不能宣告為虛函式,析構函式可以宣告為虛函式,而且有時是必須宣告為虛函式。不建議在建構函式和析構函式裡面呼叫虛函式。建構函式不能宣告為虛函式的原因是 解釋一 所謂虛函式就是多型情況下只執行乙個。而從繼承的概念來講,總是要先構造父類物件,然後才能是子類物件。如果建構函式設為虛函式,那麼當你在構造...