各種特殊函式為什麼不能是虛函式

2021-07-24 16:34:14 字數 2726 閱讀 2673

.net

/blog/crazy_programmer_p/38904281

1>內聯函式 

內聯函式是在編譯時期展開,而虛函式的特性是執行時才動態聯編,所以兩者矛盾,不能定義內聯函式為虛函式。

2> 建構函式

建構函式用來建立乙個新的物件,而虛函式的執行是建立在物件的基礎上,在建構函式執行時,物件尚未形成,所以不能將建構函式定義為虛函式。

3> 靜態成員函式

靜態成員函式屬於乙個類而非某一物件,沒有this指標,它無法進行物件的判別。

這個可以從兩個角度去理解:

1。virtual意味著在執行時期進行繫結,所以在編譯時刻需確定資訊的不能為virtual

建構函式需在編譯時刻,因為需構造出個物件,才能執行動作。

靜態成員函式不屬於任何乙個物件,編譯時刻確定不存在執行的時候選擇執行哪個的情形。

內聯函式,由於屬於編譯器的建議機制,所以其實可以virtual。

2。virtual意味著派生類可以改寫其動作

派生類的建構函式會先執行基類的建構函式而不是取代基類建構函式,也就是說基類的建構函式可以看作派生類建構函式的組成,所以並不能改寫這個函式。

靜態成》 內聯函式

內聯函式是在編譯時期展開,而虛函式的特性是執行時才動態聯編,所以兩者矛盾,不能定義內聯函式為虛函式。

2> 建構函式

建構函式用來建立乙個新的物件,而虛函式的執行是建立在物件的基礎上,在建構函式執行時,物件尚未形成,所以不能將建構函式定義為虛函式。

3> 靜態成員函式

靜態成員函式屬於乙個類而非某一物件,沒有this指標,它無法進行物件的判別。

這個可以從兩個角度去理解:

1。virtual意味著在執行時期進行繫結,所以在編譯時刻需確定資訊的不能為virtual

建構函式需在編譯時刻,因為需構造出個物件,才能執行動作。

靜態成員函式不屬於任何乙個物件,編譯時刻確定不存在執行的時候選擇執行哪個的情形。

內聯函式,由於屬於編譯器的建議機制,所以其實可以virtual。

2。virtual意味著派生類可以改寫其動作

派生類的建構函式會先執行基類的建構函式而不是取代基類建構函式,也就是說基類的建構函式可以看作派生類建構函式的組成,所以並不能改寫這個函式。

靜態成員函式不屬於任何乙個物件,所以更不能改寫其動作了。

inline和virtual不會同時起作用。帶virtual的函式在不需要動態繫結呼叫的時候,就可以inline。

虛建構函式(virtual constructor)

c++ 不支援直接的虛建構函式。虛擬機制的設計目的是使程式設計師在不完全了解細節(比如只知該類實現了某個介面,而不知該類確切是什麼東東)的情況下也能使用物件。但是,要建立乙個物件,可不能只知道「這大體上是什麼」就完事——你必須完全了解全部細節,清楚地知道你要建立的物件是究竟什麼。所以,建構函式當然不能是虛的了。但是,可通過虛函式 virtual clone()(對於拷貝建構函式)或虛函式 virtual create()(對於預設建構函式),得到虛建構函式產生的效果。注意:子類成員函式clone()的返回值型別故意與父類成員函式clone()的不同。這種特徵被稱為「協變的返回型別」(covariant return types),該特徵最初並不是c++語言的一部分,vc6.0以下版本編譯器不支援這樣的寫法。

虛析構函式(virtual destructor)

當你可能通過基類指標刪除派生類物件時,建議使用虛析構函式。虛函式繫結到物件的類的**,而不是指標/引用的類。如果基類有虛析構函式,delete baseptr(基類指標)時,*baseptr 的物件型別的析構函式被呼叫,而不是該指標的型別的析構函式。簡單講,這個類有虛函式就應該有虛析構函式。一旦你在類中加上了乙個虛函式,你就已經需要為每乙個物件支付空間代價(每個物件乙個指標),所以這時使析構函式成為虛擬的通常不會額外付出什麼。

對於那些trivial且沒有子類的類,虛析構函式只會增加開銷,不要使用。

員函式不屬於任何乙個物件,所以更不能改寫其動作了。

inline和virtual不會同時起作用。

帶virtual的函式在不需要動態繫結呼叫的時候,就可以inline。

虛建構函式(virtual constructor)

c++ 不支援直接的虛建構函式。虛擬機制的設計目的是使程式設計師在不完全了解細節(比如只知該類實現了某個介面,而不知該類確切是什麼東東)的情況下也能使用物件。但是,要建立乙個物件,可不能只知道「這大體上是什麼」就完事——你必須完全了解全部細節,清楚地知道你要建立的物件是究竟什麼。所以,建構函式當然不能是虛的了。但是,可通過虛函式 virtual clone()(對於拷貝建構函式)或虛函式 virtual create()(對於預設建構函式),得到虛建構函式產生的效果。注意:子類成員函式clone()的返回值型別故意與父類成員函式clone()的不同。這種特徵被稱為「協變的返回型別」(covariant return types),該特徵最初並不是c++語言的一部分,vc6.0以下版本編譯器不支援這樣的寫法。

虛析構函式(virtual destructor)

當你可能通過基類指標刪除派生類物件時,建議使用虛析構函式。虛函式繫結到物件的類的**,而不是指標/引用的類。如果基類有虛析構函式,delete baseptr(基類指標)時,*baseptr 的物件型別的析構函式被呼叫,而不是該指標的型別的析構函式。簡單講,這個類有虛函式就應該有虛析構函式。一旦你在類中加上了乙個虛函式,你就已經需要為每乙個物件支付空間代價(每個物件乙個指標),所以這時使析構函式成為虛擬的通常不會額外付出什麼。

對於那些trivial且沒有子類的類,虛析構函式只會增加開銷,不要使用。

建構函式為什麼不能是虛函式

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

建構函式為什麼不能是虛函式

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

建構函式為什麼不能是虛函式

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