內聯函式,建構函式,靜態函

2021-07-09 10:59:50 字數 1843 閱讀 4169

inline, static, constructor三種函式都不能帶有virtual關鍵字。

inline是編譯時展開,必須有實體;

static屬於class自己的,也必須有實體;

virtual函式基於vtable(記憶體空間),constructor函式如果是virtual的,呼叫時也需要根據vtable尋找,但是constructor是virtual的情況下是找不到的,因為constructor自己本身都不存在了,建立不到class的例項,沒有例項,class的成員(除了public static/protected static for friend class/functions,其餘無論是否virtual)都不能被訪問了。

常見的不不能宣告為虛函式的有:普通函式(非成員函式);靜態成員函式;內聯成員函式;建構函式;友元函式。

1.為什麼c++不支援普通函式為虛函式?

普通函式(非成員函式)只能被overload,不能被override,宣告為虛函式也沒有什麼意思,因此編譯器會在編譯時邦定函式。

2.為什麼c++不支援建構函式為虛函式?

這個原因很簡單,主要是從語義上考慮,所以不支援。因為建構函式本來就是為了明確初始化物件成員才產生的,然而virtual function主要是為了再不完全了解細節的情況下也能正確處理物件。另外,virtual函式是在不同型別的物件產生不同的動作,現在物件還沒有產生,如何使用virtual函式來完成你想完成的動作。(這不就是典型的悖論)

3.為什麼c++不支援內聯成員函式為虛函式?

其實很簡單,那內聯函式就是為了在**中直接展開,減少函式呼叫花費的代價,虛函式是為了在繼承後物件能夠準確的執行自己的動作,這是不可能統一的。(再說了,inline函式在編譯時被展開,虛函式在執行時才能動態的邦定函式)

4.為什麼c++不支援靜態成員函式為虛函式?

這也很簡單,靜態成員函式對於每個類來說只有乙份**,所有的物件都共享這乙份**,他也沒有要動態邦定的必要性。

5.為什麼c++不支援友元函式為虛函式?

因為c++不支援友元函式的繼承,對於沒有繼承特性的函式沒有虛函式的說法

1.頂層函式:多型的執行期行為體現在虛函式上,虛函式通過繼承方式來體現出多型作用,頂層函式不屬於成員函式,是不能被繼承的。

2.建構函式:(1)構造函式不能被繼承,因而不能宣告為virtual函式

(2)建構函式一般是用來初始化物件,只有在乙個物件生成之後,才能發揮多型作用,如果將建構函式宣告為virtual函式,則表現為在物件還沒有生成的情況下酒使用了多型機制,因而是行不通的,如下例:

#include

using namespace

std;

class

bvirtual void

show()

void

show()

3.static函式:不能被繼承,只屬於該類。

4.友元函式:友元函式不屬於類的成員函式,不能被繼承。

5.inline函式:inline函式和virtual函式有著本質的區別,inline函式是在程式被編譯時就展開,在函式呼叫處用整個函式體去替換,而virtual函式是在執行期才能夠

確定如何去呼叫的,因而inline函式體現的是一種編譯期機制,virtual函式體現的是一種執行期機制。此外,一切virtual函式都不可能是inline函式。

Matlab構造內聯函式(inline函式)

matlab通過 inline函式 構造內聯函式。注 在以後的版本中將會刪除 inline。建議使用 匿名函式。1.語法 語法說明 inline expr 按照 expr 中包含的 matlab 表示式構造乙個內聯函式物件。內聯函式的輸入引數是通過在 expr 中搜尋孤立的小寫字母字元 i 或 j ...

靜態建構函式

1 靜態建構函式既沒有訪問修飾符,也沒有引數。因為是.net呼叫的,所以像public和private等修飾符就沒有意義了。2 是在建立第乙個類例項或任何靜態成員被引用時,net將自動呼叫靜態建構函式來初始化類,也就是說我們無法直接呼叫靜態建構函式,也就無法控制什麼時候執行靜態建構函式了。3 乙個類...

靜態建構函式

1.類的建構函式有三種 例項建構函式,私有建構函式和靜態建構函式,靜態建構函式只能初始化靜態資料,或執行一次特殊的操作,這種函式只執行一次,在第一次建立類的物件的時候或者呼叫靜態成員時就會自動呼叫它,靜態建構函式沒有訪問修飾符,也沒有任何引數。可以參考一下下面的 using system using...