建構函式不能宣告為虛函式的原因及分析

2022-10-04 04:45:09 字數 1184 閱讀 6137

1. 從儲存空間角度,虛函式對應乙個指向vtable虛函式表的指標,這大家都知道,可是這個指向vtable的指標其實是儲存在物件的記憶體空間的。問題出來了,如果建構函式是虛的,就需要通過 vtable來呼叫,可是物件還沒有例項化,也就是記憶體空間還沒有,怎麼找vtable呢?所以建構函式不能是虛函式。

2. 從使用角度,虛函式主要用於在資訊不全的情況下,能使過載的函式得到對應的呼叫。建構函式本身就是要初始化例項,那使用虛函式也沒有實際意義呀。所以建構函式沒有必要是虛函式。虛函式voybsmao的作用在於通過父類的指標或者引用來呼叫它的時候能夠變成呼叫子類的那個成員函式。而建構函式是在建立物件時自動呼叫的,不可能通過父類程式設計客棧的指標或者引用去呼叫,因此也就規定建構函式不能是虛函式。

3. 建構函式不需要是虛程式設計客棧函式,也不允許是虛函式,因為建立乙個物件時我們總是要明確指定物件的型別,儘管我們可能通過實驗室的基類的指標或引用去訪問它但析構卻不一定,我們往往通過基類的指標來銷毀物件。這時候如果析構函式不是虛函式,就不能正確識別物件型別從而不能正確呼叫析構函式。

4. 從實現上看,vbtl在構造函式呼叫後才建立,因而建構函式不可能成為虛函式從實際含義上看,在呼叫建構函式時還不能確定物件的真實型別(因為子類會調父類的建構函式);而且建構函式的作用是提供初始化,在物件生命期只執行一次,不是物件的動態行為,也沒有必要成為虛函式。

5. 當乙個建構函式被呼叫時,它做的首要的事情之一是初始化它的vptr。因此,它只能知道它是「當前」類的,而完全忽視這個物件後面是否還有繼承者。當編譯器為這個建構函式產生**時,它是為這個類的建構函式產生**——既不是為基類,也不是為它的派生類(因為類不知道誰繼承它)。所以它使用的vptr必須是對於這個類的vtable。而且,只要它是最後的構造函式呼叫,那麼在這個物件的生命期內,vptr將保持被初始化為指向這個vtable, 但如果接著還有乙個更晚派生的建構函式被呼叫,這個建構函式又將設定vptr指向它的 vtable,等.直到最後的建構函式結束。vptr的狀態是由被最後呼叫的建構函式確定的。這就是為什麼構造函式呼叫是從基類到更加派生類順序的另乙個理由。但是,當這一系列構造函式呼叫正發生時,每個構造函www.cppcns.com數都已經設定vptr指向它自己的vtable。如果函式呼叫使用虛機制,它將只產生通過它自己的vtable的呼叫,而不是最後的vtable(所有建構函式被呼叫後才會有最後的vtable)。

本文標題: 建構函式不能宣告為虛函式的原因及分析

本文位址: /ruanjian/c/100268.html

建構函式不能宣告為虛函式

建構函式不能宣告為虛函式的原因 1.所謂虛函式就是多型情況下只執行乙個,而從繼承的概念來講,總是先構造父類物件,然後才能使子類物件,如果建構函式設為虛函式,那麼你在構造父類的建構函式時就不得不顯式的呼叫構造,還有乙個原因就是為了防錯誤的發生,試想如果你在子類中一不小心重寫了個跟父類建構函式一樣的函式...

C 中建構函式不能宣告為虛函式

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

C 這些函式不能宣告為虛函式的原因

1.不能宣告為虛函式的函式 普通函式 非成員函式 我在前面多型這篇部落格裡講到,定義虛函式的主要目的是為了重寫達到多型,所以普通函式宣告為虛函式沒有意義,因此編譯器在編譯時就繫結了它。靜態成員函式 靜態成員函式對於每個類都只有乙份 所有物件都可以共享這份 他不歸某乙個物件所有,所以它也沒有動態繫結的...