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

2021-05-28 06:38:53 字數 867 閱讀 1899

建構函式不能宣告為虛函式的原因:

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

class a;

在編譯處,便已經提示無法通過,將virtual去掉

2.虛函式的主要意義在於被派生類繼承從而產生多型,派生類的建構函式中,編譯器會加入構造基類的**,如果基類的建構函式用到了引數,則派生類在其建構函式中必須為基類給出引數,就是這個原因,原因有點繞,就是說如果派生類的建構函式必須跟父類一摸一樣,這顯然是不符合實際的

當然還有其他的解釋:

1)從儲存空間角度,虛函式對應乙個vtable,可是這個vtable其實是儲存在物件的記憶體空間的。問題出來了,如果建構函式是虛的就需要通過vtable來呼叫,可是物件還沒有例項化,也就是記憶體空間還,沒有,無法找到vtable,所以建構函式不能為虛函式。

2)從使用角度 虛函式主要用於在資訊不全的情況下,能使過載的函式得到對應的呼叫。建構函式本身就是要初始化例項,那使用虛函式也就沒有例項意義了,最開始的例項都沒有初始化,何來多型呢。虛函式的作用於通過父類的指標或者引用來呼叫它的時候能夠變成呼叫子類的那個成員函式。而建構函式實在建立物件的時候自動呼叫的,不可能通過父類的指標或引用去呼叫,因此規定建構函式不能為虛函式。

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

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

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

哪些函式不能被宣告為虛函式

常見的不不能宣告為虛函式的有 普通函式 非成員函式 靜態成員函式 內聯成員函式 建構函式 友元函式。1 為什麼c 不支援普通函式為虛函式?普通函式 非成員函式 只能被overload,不能被override,宣告為虛函式也沒有什麼意思,因此編譯器會在編譯時邦定函式。2 為什麼c 不支援建構函式為虛函...

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

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