建構函式 析構函式是否要宣告為虛函式的問題

2021-05-25 13:49:15 字數 738 閱讀 4962

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

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 構造乙個物件的時候,必須知道物件的實際型別,而虛函式行為是在執行期間確定實際型別的。而在構造乙個物件時,由於物件還未構造成功。編譯器無法知道...

建構函式和析構函式能否宣告為虛函式?

建構函式不能宣告為虛函式,析構函式可以宣告為虛函式,而且有時是必須宣告為虛函式。不建議在建構函式和析構函式裡面呼叫虛函式。建構函式不能宣告為虛函式的原因是 解釋一 所謂虛函式就是多型情況下只執行乙個。而從繼承的概念來講,總是要先構造父類物件,然後才能是子類物件。如果建構函式設為虛函式,那麼當你在構造...