函式能否即是虛函式又是內聯函式,乙個函式能否即是虛函式又是內聯函式?

時間 2021-12-19 18:41:34

1樓:她是我的小太陽

通常,乙個內聯函式是被的。

class cfoo

int setval(int v)

};這裡,如果使用下列**:

cfoo x;

x.setval(17);

int y = x.getval();

那麼編譯器產生的目標**將與下面的**段一樣:

cfoo x;

x.val = 17;

int y = x.val;

虛函式有多型性,意味著派生的類能實現相同的函式,但功能卻不同。假設 getval 被宣告為虛函式,並且有第二個 以不同方法實現的類 cfoo2:

class cfoo2 : public cfoo

};如果 pfoo是乙個 cfoo 或 cfoo2 指標,那麼,無論 pfoo 指向哪個類 cfoo 或 cfoo2,成員函式 pfoo->getval 都能呼叫成功。

有兩種方式建立內聯函式

第一種是在函式定義中使用關鍵字 inline,如:

inline cfoo::getval()

第二種是在類的宣告中編寫函式體,就象前面的 cfoo2::getval 一樣。所以如果將虛函式體包含在類的宣告中,如:

class cfoo

};最好不要使用內聯虛函式,因為它們幾乎不會被,即便你的函式只有一行,最好還是將它與其它的類函式一起放在模組(cpp檔案) 中。當然,開發者常常將簡短的虛函式放在類宣告中-不是因為他們希望這個函式被為內聯,而是因為這樣做更方便和可讀性更強。

2樓:搞笑點

當然不能,虛函式意味在執行期確定函式的呼叫位址,內聯函式如同巨集的用法一樣,相當於在編譯期把呼叫內聯的地方加上了函式實現的**。前者是動態的,後者是靜態的。

另外,即使編譯器通過了編譯,那麼函式也不可能是內聯的

3樓:匿名使用者

純粹扯淡,有內聯虛函式之說的,參考

不要誤導。

4樓:焉湉湉

不行虛函式需要執行時繫結,如果能內聯怎樣繫結?

5樓:苯寶寶不笨

乙個函式不可以既是虛函式又是內聯函式。

嚴格的說法是:就算能建立內聯虛函式,或者說虛函式被宣告為內聯函式,編譯器遇到這種情況根本不會把這樣的函式內聯,而是當做普通函式來處理。編譯器拒絕乙個非虛內聯函式,c++編譯器常常首先會報錯:

「內聯中斷-函式太大」。如果內聯函式呼叫自身,或者在某處傳遞其位址,編譯器必須產生乙個正常(外聯)函式。對於內聯虛函式,編譯器將把它看做普通的虛函式。

應用中最好不要使用內聯虛函式,因為它們幾乎不會被。實際中開發者常常將簡短的虛函式放在類宣告中,這樣做的目的不是希望這個函式被為內聯,而是因為這樣做程式看起來更方便和可讀性更強。

c++內聯函式中是否可以包含別的函式?

6樓:匿名使用者

內聯的意義是:將函式在呼叫出,將區域性變數名通過一種機制更名使得不重複,這樣的好處是省去函式呼叫時的指令浪費(壓棧和呼叫結束後恢復現場,甚至內聯有時可能會使得編譯器可以優化掉更多的臨時物件),所以內聯函式內是可以呼叫其他函式的,不過需要注意的是編譯器有時會忽略內聯請求的,因為它可能會判定此函式過於複雜,不易,比如內含遞迴和迴圈時。

7樓:匿名使用者

是的,這種函式是有效的內聯函式

c++判斷題 定義在類內的成員函式是內聯函式,定義在類體外的函式不能使內聯函式

8樓:匿名使用者

錯誤!內聯函式的定義如下:

內聯函式是使用inline關鍵字宣告的函式,也成內嵌函式,它主要的作用是解決程式的執行效率。

只有inline這個關鍵字包含在函式宣告中, 才是內聯函式。 與類沒有任何的關係!

舉例:static inline int max(int a, int b);

為什麼虛函式不應該是內聯(inline)函式

9樓:泣康勝

常見的不能宣告為虛函式的有:普通函式(非成員函式)、靜態成員函式、內聯成員函式、建構函式、友元函式。1、為什麼c++不支援普通函式為虛函式?

普通函式(非成員函式)只能overload,不能被override,宣告為虛函式也沒有什麼意思,因此編譯器會在編譯時繫結函式。2、為什麼c++不支援建構函式為虛函式?這個原因很簡單,主要是從語義上考慮,所以不支援。

因為建構函式本來是為了明確初始化物件成員才產生的,然而virtual function主要是為了在不完全了解細節的情況下也能正確處理物件。另外,虛函式是在不同型別的物件產生不同的動作,現在物件還沒有產生,如何使用虛函式來完成你想完成的動作。3、為什麼c++不支援靜態成員函式為虛函式?

靜態成員函式對於每個類來說只有乙份**,所有的物件都共享這乙份**,他不歸某個物件所有,所以他也沒有動態繫結的必要性。4、為什麼c++不支援內聯成員函式為虛函式? 其實很簡單,內聯函式就是為了在**中直接,減少函式呼叫話費的代價,虛函式是為了在繼承後物件能夠準確的執行自己的動作,這是不可能統一的。

再說,inline函式在編譯時被,虛函式在執行時才能動態的繫結函式。5、為什麼c++不支援友元函式為虛函式?

10樓:雨天

虛函式機制:在每乙個有虛函式的類裡都有乙個表vtable,存放虛函式位址

內聯函式:編譯器把內聯函式的**存放在符號表中,每次呼叫會把函式**插入到呼叫處,所以無法取得位址

二者相連系:可以知道虛函式不能為內聯函式,即使寫成內聯形式,編譯器也把它當成普通函式。但是如果是純虛函式,禁止寫成內聯形式。

c語言有內聯函式嗎?

11樓:愈盈何婕

其實看你用得編譯器了,如果你用的vc++6.0的話,

不管是.c檔案還是.cpp檔案都可以用inline

定義內聯函式。但是語法來說,c語言是沒有內聯這個概念的,c++才有

12樓:風若遠去何人留

內聯函式是指用inline關鍵字修飾的函式。

inline為c++的關鍵字,後來被擴充套件到c語言。所以早期的c語言ansi c是不支援這個關鍵字的,如果使用inline關鍵字會編譯出錯。不過後續的c99規範擴充套件了這一關鍵字,於是在支援c99規範的編譯器中,是可以使用inline的。

是否支援,在**中寫乙個內聯函式定義,編譯不報錯即是支援的。

如果**有可移植的需求,還是不要使用內聯函式為好,這種情況下可以使用巨集定義來代替內聯。

13樓:種馳樂正雪珊

有的。不過c語言的內聯函式是在最新的c99標準裡才加入的,在以前的c89標準裡是沒有的。我們現在使用的編譯器很多都還是基於c89標準的,對於c99標準的支援度各個編譯器都不同,所以能不能在c語言裡使用內聯函式要看具體編譯器支不支援了。

14樓:匿名使用者

c語言肯定有,申明為內斂函式,函式體內不能有迴圈語句

15樓:

這個是內聯函式。

c語言本身是不支援內聯函式的,在最新的c標準c99中c語言支援了內聯函式。

c++支援內聯函式。

從編譯器的角度:

有些c語言編譯器,例如gnu c提供了內聯函式的支援。

所有c++編譯器都支援內聯函式。

如果你的c語言編譯器不支援內聯函式,看看它有多古老,太古老不行(例如 turbo c 2.0)。如果是c/c++合體編譯器,那就切換到編譯c++模式(例如visualc++)。

16樓:匿名使用者

有的,這個應該是沒問題的

c++ 成員函式是不是都是內聯函式

17樓:匿名使用者

當然不是,或者說,除非特殊的inline宣告,類成員函式都不是內聯函式。

虛函式的特性是什麼?

18樓:匿名使用者

虛函式必須是基類的非靜態成員函式,其訪問許可權可以是protected或public。

虛函式的作用是實現動態聯編。

只能通過指向基類的指標或基類物件的引用來呼叫虛函式

c 行內函數和普通函式的區別

八哥說科技 1 編譯結果不同 2 編譯的時間不同 對於基於c的編譯系統,行內函數的使用可能大大增加編譯時間,因為每個呼叫該函式的地方都需要替換成函式體,量的增加也同時帶來了潛在的編譯時間的增加。3 執行的效率不同 使用行內函數時,必須在程式佔用空間和程式執行效率之間進行權衡,因為過多的比較複雜的函式...

有沒有函式既是奇函式又是偶函式的

夢色十年 有。這個函式是 定義域是 1,1,因為對於定義域的每一個x,都有f x 0,所以f x f x f x 0。一般地,如果對於函式f x 的定義域內任意的一個x,都有f x f x 那麼函式f x 就叫做偶函式 even function 如果對於函式f x 的定義域內任意一個x,都有f x...

虛擬函式virtual的作用,C 中虛擬函式的作用是什麼?它應該怎麼用呢?

文件類共創空間 虛擬函式的作用是允許在派生類中重新定義與基類同名的函式,並且可以通過基類指標或引用來訪問基類和派生類中的同名函式。例 基類與派生類中有同名函式。在下面的程式中student是基類,graduate是派生類,它們都有display這個同名的函式。include include usin...