1樓:
因為做不到啊,舉個例子,抽象類A有乙個虛函式B。現在我寫乙個函式,引數是抽象類A的指標,這個函式裡面呼叫虛函式B。
那怎麼知道虛函式B是誰呢?
2樓:
Parent*p
=rand()&
1==0?
newChild1():
newChild2
();因為這種情況沒法在編譯期完成。
3樓:羊羊羊
c++有所謂編譯器多型,就是template。
一般我們說多型從其意義講顯然是執行期決定型別的,而c++對多型支援的基礎,虛表實際就是在編譯器生成好的,所以你的問題沒意義。
4樓:
因為我不知道執行期的狀態啊
拿乙個最簡單的例子:
class BaseItem;
class ItemA:BaseItem{};
class ItemB:BaseItem{};
class ItemC:BaseItemwhile(nullptr != (rawData = readRawData()))break;
case ItemTypeB:break;
case ItemTypeC:break;
default:{}
} if(nullptr != pItem)很明顯,我在編譯期是無法得知容器中物件型別的,那麼當我需要對容器中物件進行批量操作的時候,多型就是唯一的選擇了。對於最後的for迴圈,無論你做什麼,你都無法在編譯期將其展開,只能在執行期根據實際的型別情況呼叫不同的函式。
5樓:
c++能(需要)做到的是在做同樣的事時,效能不比c差。
而執行時多型是一種很常見的需求:
例如說你在實現乙個庫的api時,你根本不會知道實際傳進來的指標實際是哪個型別。
那你要實現這類多型的需求,你用c來實現,你寫出來的很可能還不如c++編譯器弄出來的。
所以,這種效能開銷的差異,本質上是需求產生的,而不是語言或者編譯器產生的。
6樓:歐文韜
c++的虛表不是和c慣用的用struct放一坨函式指標,然後另乙個struct裡存這個struct例項的指標的寫法一樣的麼。只不過乙個自動做乙個手動做而已,而且c++還可以獲得更多的型別資訊和限定來做更多的優化。
其他的像繼承和過載,就是編譯期完成的呀。
你為什麼會覺得c更快?
7樓:Star.E
std::variant
可以實現執行時多型,只是型別必須在編譯期已知,編譯後不能擴充套件型別。速度和c一樣快,不需要虛函式。支援multi-dispatch(multi-visit)
基於variant還能模擬簡單的pattern matching,極度好用
8樓:Tanki Zhang
根據實現是靜態鏈結(static dispatch)還是動態鏈結(dynamic dispatch),我們可以將多型分為靜態多型(static polymorphism)和動態多型(dynamic polymorphism)。
在 c++ 中,我們通過繼承,配合虛函式(virtual function)來實現動態多型。含有虛函式的型別將內部自帶乙個虛函式表(virtual method table, VMT),用以存放虛函式的函式指標。這使得自定義型別的例項大小有所增加,並且在執行時將額外增加從 VMT 定址,在 code memory 中跳轉的開銷。
這部分可以認為是使用 virtual 不可避免的 trade off。但是這個機制本身是完全可以在 C 中模擬的,並且模擬的效能大多數情況下很難做到比編譯器的實現和優化快。
而靜態多型的實現方法很多,例如使用奇異遞迴模板模式CRTP(Curiously recurring template pattern)。
總的來說,題主問題是偽命題。C++ 能在編譯期完成的多型都已經完成了。剩下一些依賴執行時資訊的,C艹表示無能為力。
9樓:射手老師
聽說CRTP麼,這個是可以支援編譯期多型的,執行期多型就是C++多型的目的,希望乙個基類指標可以在執行的時候指向物件A,也能指望物件B。好多設計模式都是根據這樣的多型實現的。
10樓:馮東
別覺得必須得 compile time ONLY polymorphism 才「可以和 C 的效能持平」,因為 C 也可以有執行時多型。虛函式的效能開銷是設計需求的必需元素。設計成多型的 code,用什麼語言都是 C++ 虛函式那個開銷。
平時說的 C++ 效能開銷比 C 稍大根本不是說多型方面。
舉個例子。Linux 裡的檔案系統 VFS 就是多型的例子。檔案系統的介面是統一的,不同的檔案系統 EXT4, ZFS, FAT 的驅動程式有不同的實現。
請問 compiler 怎麼在編譯 kernel 的時候知道使用者掛的什麼盤呢?
我們為什麼不能開發乙個漢語的編譯器,類似C ,java?
yyf 首先,說下我是個剛開始學習的小白 大神給些同情 我也不是標準的程式設計師,我只是萬千人中最平常的那乙個。有人說沒有必要,因為別人的成果已經很好了,我們再來開發不是浪費時間麼!但是,我想說的是,作為底層的一些東西還是自己的好。用漢語做語法,最起碼中中國人會感到親近,沒有看著就頭大的感覺,而且,...
羅素為什麼說參差多型乃是幸福的本源?
王孫歸 重點不是人與人的不同到底 好不好 而是允許這個世界存在不同的這份寬容,是幸福生活的重要條件。無論高矮胖瘦,智愚閒不肖,愛吃辣愛吃甜,在不影響他人的情況下,各得其樂,這就是幸福了。如果強行按照同一種標準來規定,那麼無論是動作的實施者和承受者,最終都不會得到快樂。你不愛吃香菜,你媽非要你吃,最後...
C語言病毒繁殖,為什麼一旦輸入93,編譯器就沒反應了?
王旭東 這題嚇死我了,尋思著有什麼程式需要在編譯的時候輸入?或者程式中乙個數字能造成編譯程式宕機?這真的是超級病毒了!題主,拜託先把一些基本概念搞搞清楚好吧!語法和演算法方面其他人都說過了,在此不表。但是好歹自己設個斷點看看呢!單步執行試試看!改變一下輸入的資料試試看!先從n比較小的數開始單步執行。...