C 中不能宣告為虛函式的有哪些函式(未讀)

2021-08-08 19:11:18 字數 2220 閱讀 7175

傳送門

c++中不能宣告為虛函式的有哪些函式

可省~~(虛函式基礎)定義:

純虛函式是在宣告虛函式時被「初始化」為0的函式。

宣告純虛函式的一般形式是 virtual 函式型別 函式名 (參數列列) =0;

注意:①純虛函式沒有函式體;

②最後面的「=0」並不表示函式返回值為0,它只起形式上的作用,告訴編譯系統「這是純虛函式」;

③這是乙個宣告語句,最後應有分號。

s純虛函式只有函式的名字而不具備函式的功能,不能被呼叫。它只是通知編譯系統: 「在這裡宣告乙個虛函式,留待派生類中定義」。

在派生類中對此函式提供定義後,它才能具備函式的功能,可被呼叫。

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

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

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

多型的執行期行為體現在虛函式上,虛函式通過繼承方式來體現出多型作用,頂層

函式不屬於成員函式,是不能被繼承的

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

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

1)建構函式不能被繼承,因而不能宣告為virtual函式

(2)建構函式一般是用來初始化物件,只有在乙個物件生成之後,才能發揮多型

作用,如果將建構函式宣告為virtual函式,則表現為在物件還沒有生成的情

況下酒使用了多型機制,因而是行不通的。

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

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

inline函式和virtual函式有著本質的區別,inline函式是在程式被編譯時就展開,在函式呼叫處用整個函式體去替換,而virtual函式是在執行期才能夠確定如何去呼叫的,因而inline函式體現的是一種編譯期機制,virtual函式體現的是一種執行期機制。此外,一切virtual函式都不可能是inline函式。

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

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

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

因為c++不支援友元函式的繼承,對於沒有繼承特性的函式沒有虛函式的說法。友元函式不屬於類的成員函式,不能被繼承。

eg:

1/*2

* main.cpp3*

4* created on: 2012-11-17

5* author: china6*/

7 #include 8

using

namespace std;

9class b

14/*

在類的繼承中,如果有基類指標指向派生類,那麼用基類指標delete時,如果不定義成虛函式,派生類中派生的那部分無法析構。

15* 你可以吧virtual去掉試一下

16* 因此在類的繼承體系中,基類的析構函式不宣告為虛函式容易造成記憶體洩漏。所以如果你設計一定類可能是基類的話,必須要宣告其為虛函式。

17*

*/18

virtual ~b()

21virtual

void func()

2425

private:

26 };

27class d :public b

32 ~d()

35void func()

3839

private:

40 };

41int main(int argc, char **argv)

C 中不能宣告為虛函式的有哪些函式

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

C 中不能宣告為虛函式的有哪些函式

分類 c 2012 11 17 22 22 3243人閱讀收藏 舉報c c 多型機制 虛函式 常見的不不能宣告為虛函式的有 普通函式 非成員函式 靜態成員函式 內聯成員函式 建構函式 友元函式。1 為什麼c 不支援普通函式為虛函式?普通函式 非成員函式 只能被overload,不能被override...

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

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