c 筆記 構造 析 函式能否呼叫虛函式

2021-10-22 20:28:19 字數 1242 閱讀 1535

示例**

class

base

virtual

void

func()

;};class

derive

virtual

void

func()

;private

:int data;};

intmain()

執行結果

1. 程式輸出: 1 。執行了base中的func(), 而沒有執行derive中的func()。按理來說,乙個基類

的指標指向派生類,執行時動態繫結後應該執行的是derive中的func可是卻執行的是base中的func(),

這是為什麼呢?

產生的這個結果的原因

1. 構造上: 在例項化乙個派生類時,先執行的基類的建構函式,最後再執行派生類的建構函式。在

構造基類物件時,派生類的資料成員都沒有被初始化,此時呼叫派生類的virtual

func

()將會對乙個

未被初始化的位址進行解引用,導致訪問非方法記憶體,而出錯。所以此時只能執行基類的virtual func;

2. 總結:

①、派生類物件尚未被初始化,呼叫派生類版本的func

()會導致訪問非法記憶體

②、當在構造基類部分時,派生類還沒被完全建立,從某種意義上講此時它只是個基類物件。

錯誤

如果能生成可執行檔案,執行時一定出錯。

· 析構函式的呼叫跟建構函式的呼叫順序是相反的,它從最派生類的析構函式開始的。也就是說當基類

的析構函式執行時,派生類的析構函式已經執行過,派生類中的成員資料被認為已經無效。假設基類

中虛函式呼叫能呼叫得到派生類的虛函式,那麼派生類的虛函式將訪問一些已經「無效」的資料,所

帶來的問題和訪問一些未初始化的資料一樣

1. 基類部分在派生類部分之前被構造,當基類建構函式執行時派生類中的資料成員還沒被初始化。如

果基類建構函式中的虛函式呼叫被解析成呼叫派生類的虛函式,而派生類的虛函式中又訪問到未初始化

的派生類資料,將導致程式出現一些未定義行為和bug。

2. 析構函式的呼叫跟建構函式的呼叫順序是相反的,它從最派生類的析構函式開始的。也就是說當基

類的析構函式執行時,派生類的析構函式已經執行過,派生類中的成員資料被認為已經無效。

建構函式,析構函式能否宣告為虛函式

建構函式不能宣告為虛函式 析構函式可以宣告為虛函式,而且有時是必須宣告為虛函式 不建議在建構函式和析構函式裡面呼叫虛函式。建構函式不能宣告為虛函式的原因是 1 構造乙個物件的時候,必須知道物件的實際型別,而虛函式行為是在執行期間確定實際型別的。而在構造乙個物件時,由於物件還未構造成功。編譯器無法知道...

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

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

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

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