不在構造和析構過程中呼叫虛函式

2021-08-19 10:03:31 字數 893 閱讀 8972

1.不能在構造過程中呼叫虛函式。

比如:在基類中有乙個虛函式。

class transaction;

transaction::transaction() //基類建構函式實現

下面有兩個派生類繼承它:

class buytransaction:public transaction

class selltransaction:public transaction

那麼當我們建立乙個派生類物件時,比如:

buytransaction b;
這個時候就會有乙個問題,建立派生類物件,首先是基類的建構函式被呼叫。然後才是派生類的建構函式被呼叫。

但是在這個例子中,基類transaction的建構函式中會呼叫虛函式logtransaction。這個時候是在構造基類的過程中,

此時,派生類的成員變數尚未初始化,如果在基類構造構成中虛函式下降至派生類階層,那麼在派生類中必然要用到區域性成員變數,而這個時候這是c++所不允許的。所以在基類構造期間,虛函式絕不會下降到派生類階層。

2.在析構過程中也不能呼叫虛函式

在析構的時候,會先呼叫派生類的析構函式,然後再呼叫基類的析構函式。一旦派生類的析構函式開始執行,物件內的派生類成員變數便呈現未定義值。

所以在派生類的析構函式呼叫完成之後,會進入基類的析構函式,此時就變為基類的物件。當析構函式中呼叫了虛函式時,編譯器會無法連線,找不到該虛函式的實現**。

3.如果基類中有多個建構函式,並且每個建構函式都需執行某些相同工作,那麼可以將共同的初始化**放進乙個初始化函式裡,如init內,通常這個init放在private下。

4.在構造期間,可以令派生類將必要的構造資訊向上傳遞至基類建構函式。

絕不在構造和析構過程中呼叫虛函式

一 中心內容 因為類呼叫從不下降至派生類,導致若為純虛函式,則找不到函式的實現 若為非虛函式,則可能會導致呼叫錯誤的函式版本。二 內容簡介 考慮這樣一系列繼承 class transaction public transaction virtual void logtransaction const...

C 不在建構函式和析構函式中呼叫虛函式

首先在建構函式或者是在析構函式中是可以呼叫虛函式的。但是我們最好不要這樣做。一 不在建構函式中呼叫虛函式 當我們在建構函式中呼叫虛函式時,一定呼叫的是基類的虛函式,即使此時你定義的是乙個派生類的物件。原因一 在建立派生類物件時,一定首先呼叫的基類的建構函式,其次在呼叫的是派生類建構函式。問題就在於,...

Item 9 絕不在構造和析構過程中呼叫虛函式

這個應該是c 面試的經典題了,所以值得拿出來說一說 比如在乙個繼承體系中,基類的建構函式中呼叫了乙個基類的成員函式,你把它宣告為virtual,至少你在設計的時候是認為它有virtual屬性的。class base base base class derivedone public base cla...