c 的虛擬函式能內聯嗎?

2025-07-21 09:35:28 字數 4077 閱讀 4631

1樓:司黛

可以但是編譯器在處理的時候還是按照函式編譯的,內聯實際上是不起作用的。

因為虛擬函式是要為多型提供基礎的,如果按照行內函數後就無法實現多型了。

c++如何處理內聯虛擬函式麻煩告訴我

2樓:網友

}; 當乙個函式是內聯和虛擬函式時,會發生**替換或使用虛表呼叫嗎? 為了弄清楚內聯和虛擬函式,讓我們將它們分開來考慮。通常,乙個行內函數是被的。

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

int y = ; 那麼編譯器產生的目標**將與下面的**段一樣: cfoo x;

int y = ; 你當然不能這麼做,因為val是個私有變數。行內函數的優點是不用函式呼叫就能隱藏資料,僅此而已。 虛擬函式有多型性,意味著派生的類能實現相同的函式,但功能卻不同。

假設 getval 被宣告為虛擬函式,並且你有第二個 以不同方法實現的類 cfoo2: class cfoo2 : public cfoo

如果pfoo是乙個 cfoo 或 cfoo2 指標,那麼,無論 pfoo 指向哪個類 cfoo 或 cfoo2,成員函式 pfoo->getval 都能呼叫成功。 如果乙個函式既是虛擬函式,又是行內函數,會是什麼情況呢?記住,有兩種方式建立行內函數, 第一種是在函式定義中使用關鍵字 inline,如:

inline cfoo::getval() 第二種是在類的宣告中編寫函式體,就象前面的 cfoo2::getval 一樣。

所以如果將虛擬函式體包含在類的宣告中,如: class cfoo

編譯器便認為這個函式 getval 是內聯的,同時也是虛擬的。那麼,多型性和內聯特性如何同時工作呢? 編譯器遵循的第乙個規則是無論發生什麼事情,多型性必須起作用。

如果有乙個指向 cfoo 物件的指標,pfoo->getval 被保證去呼叫正確的函式。一般情況下,這就是說函式 getval 將被例項化為非行內函數,並有vtable(虛表)入口指向它們。但這並不意味著這個函式不能被擴充套件!

再看看下面的**: cfoo x;

int y = 編譯器知道x是 cfoo,而不是cfoo2,因為這個堆物件是被顯式宣告的。x肯定不會是cfoo2。所以 setval/getval 內聯是安全的。

cfoo* pfoo=&x;

pfoo->setval(17);

int y = pfoo->getval();

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

3樓:網友

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

4樓:匿名使用者

是的,這種函式是有效的行內函數。

哪些函式不能為虛擬函式

5樓:棕漠土

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

1、為什麼c++不支援普通函式為虛擬函式? 普通函式(非成員函式)只能overload,不能被override,宣告為虛擬函式也沒有什麼意思,因此編譯器會在編譯時繫結函式。2、為什麼c++不支援建構函式為虛擬函式?

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

3、為什麼c++不支援靜態成員函式為虛擬函式? 靜態成員函式對於每個類來說只有乙份**,所有的物件都共享這乙份**,他不歸某個物件所有,所以他也沒有動態繫結的必要性。4、為什麼c++不支援內聯成員函式為虛擬函式?

其實很簡單,行內函數就是為了在**中直接,減少函式呼叫話費的代價,虛擬函式是為了在繼承後物件能夠準確的執行自己的動作,這是不可能統一的。再說,inline函式在編譯時被,虛擬函式在執行時才能動態的繫結函式。5、為什麼c++不支援友元函式為虛擬函式?

c++中的虛擬函式是什麼?

6樓:李李李

c++中的虛擬函式是允許在派生類中重新定義與基類同名的函式,並且可以通過基類指標或引用來訪問基類和派生類中的同名函式。

c++中的虛擬函式的作用主要是實現了多型的機制。

關於多型,簡而言之就是用父型別別的指標指向其子類的例項,然後通過父類的指標呼叫實際子類的成員函式。

這種技術可以讓父類的指標有「多種形態」,這是一種泛型技術。所謂泛型技術,說白了就是試圖使用不變的**來實現可變的演算法。比如:

模板技術,rtti技術,虛擬函式技術,要麼是試圖做到在編譯時決議,要麼試圖做到執行時決議。

c++虛擬函式到底需要實現嗎

7樓:網友

是這樣的,抽象類中的純虛擬函式是一定不能實現的,普通的虛擬函式看繼承的具體情況。

8樓:陳釗翔

既然你問出這個問題就說明不需要了。

9樓:網友

用到就要實現,你不去實現就去用肯定有問題。

在c++中用虛擬函式的作用是什麼?為什麼要用到虛擬函式

10樓:阿亮臉色煞白

虛擬函式:在某基類中宣告為 virtual 並在乙個或多個派生類中被重新定 義的成員函式,用法格式為:virtual 函式返回型別 函式名(參數列) ;實現多型性,通過指向派生類的基類指標或引用,訪問派生類中同名覆蓋成員函式。

眾所周知,在同一類中是不能定義兩個名字相同、引數個數和型別都相同的函式的,否則就是「重複定義」。但是在類的繼承層次結構中,在不同的層次中可以出現名字相同、引數個數和型別都相同而功能不同的函式。例如在例具體**請檢視:

c++多型性的乙個典型例子)

程式中,在circle類中定義了。

area函式,在circle類的派生類cylinder中也定義了乙個area函式。這兩個函式不僅名字相同,而且引數個數相同(均為0),但功能不。

同,函式體是不同的。前者的作用是求圓面積,後者的作用是求圓柱體的表面積。這是合法的,因為它們不在同乙個類中。

編譯系統按照同名覆蓋的原則決定呼叫的物件。在例程式中用 )

呼叫的是派生類cylinder中的成員函式area。如果想呼叫cy1 中的直接基類circle的area函式,應當表示為。

area()。用這種方法來區分兩個同名的函式。但是這樣做 很不方便。

人們提出這樣的設想,能否用同乙個呼叫形式,既能呼叫派生類又能呼叫基類的同名函式。在程式中不是通過不同的物件名去呼叫不同派生層次中的同名函式,而是通過指標呼叫它們。例如,用同乙個語句「pt->display( )可以呼叫不同派生層次中的display函式,只需在呼叫前給指標變數 pt 賦以不同的值(使之指向不同的類物件)即可。

打個比方,你要去某一地方辦事,如果乘坐公交車,必須事先確定目的地,然後乘坐能夠到達目的地的公交車線路。如果改為乘計程車,就簡單多了,不必查行車路。

線,因為計程車什麼地方都能去,只要在上車後臨時告訴司機要到**即可。如果想訪問多個目的地,只要在到達乙個目的地後再告訴司機下乙個目的地即可,顯。

然,「打的」要比乘公交車 方便。無論到什麼地方去都可以乘同—輛計程車。這就是通過同一種形式能達到不同目的的例子。

c++中的虛擬函式就是用來解決這個問題的。虛擬函式的作用是允許在派生類中重新定義與基類同名的函式,並且可以通過基類指標或引用來訪問基類和派生類中的同名函式。

c++裡虛擬函式有什麼作用?

11樓:網友

含義是讓乙個函式具有不同的行為。

舉例來說,人這個類有個函式叫工作!醫生和交版警分別繼承自權人,都具有了工作這個函式,當然醫生的工作內容是治病,交警的工作內容是指揮交通。

現在你需要將交警和醫生同等對待,歸類為人,並分別呼叫其工作函式去執行工作。

如果工作這個函式不是虛擬函式,那你呼叫的就是人的工作函式,無任何意義!相反,如果是虛擬函式,那交警就會去指揮交通,醫生會去治病!

C行內函數可以呼叫行內函數嗎

稱為成員函式 前面講過一般的成員函式,它是根據某種類的功能的需要來定義的。又講述了一些特殊的成員函式 建構函式 解構函式 拷貝初始化建構函式等。還有一些成員函式後面還會介紹。成員函式除了說明和定義在類中之外,還有些什麼特性,這是本節討論的問題。一 內聯性和外聯函式 類的成員函式可以分為行內函數和外聯...

c中行內函數是什麼意思C中行內函數是什麼意思?

行內函數具有一般函式的特性,它與一般函式所不同之處只在於函式呼叫的處理。一般函式進行呼叫時,要將程式執行權轉到被呼叫函式中,然後再返回到呼叫它的函式中 而行內函數在呼叫時,是將呼叫表示式用行內函數體來替換。在使用行內函數時,應注意如下幾點 1.在行內函數內不允許用迴圈語句和開關語句。如果行內函數有這...

c中怎麼理解類內定義的成員函式就是行內函數

在類內定義的成員函式預設為inline,不論前面是否加了inline,當然,是否內聯還是取決於編譯器啦 而在類外定義的成員函式就不是行內函數。c 中怎麼理解類內定義的成員函式就是行內函數?當你的class。public成員函式宣告的時候,只要這個函式體當中不存在switch等迴圈語句的時候,則這個函...