虛函式和 std function 如何取捨?

時間 2021-06-02 13:01:41

1樓:zr scat

類似於c語言函式指標的做法,在某種程度上,可以達到類似的效果(實際上lamada比c的函式指標更靈活一點,畢竟還可以直接bind上下文)。

某些情況下,用繼承是更直觀的,比如裝飾模式下對繼承的使用。而在gui開發裡對不同控制項的派生是可以很直觀的使用裝飾模式的。

2樓:青禾紀

這個東西在C++11之前就有了吧,只是C+11才加入標準我的回答就是完全可以取代,effective C++ Item35: Consider alternatives to virtual functions.

3樓:

我是delphi出身的,std::function給我第一眼的感覺就是這玩意拿來實現事件機制極棒,所以這兩個就是事件和繼承的區別啊,應用場合不同沒有誰好誰壞。

不過我寫庫時都是同時用的,具體是:虛函式優先順序高,先呼叫虛函式(即類內的事件處理函式),虛函式返回真表示此事件已被虛函式handle,處理結束;反之則繼續呼叫繫結的std::function(即類外的事件處理函式)。

這樣的話,使用者可以根據具體情況和方便程度選擇繼承和事件用哪個。

4樓:wp zh

1.如果做乙個GUI框架,到處這樣做,行不行?

行。2.從語言的角度,這樣是否比虛函式的方式更好?

好。如果僅僅為了override乙個onclick,而繼承乙個button的話,實在是浪費。繼承就是這樣想要的不想要的一股腦全給你了。

所謂的耦合也就產生了。這裡如果把onclick的處理做成乙個基類clickprocer,然後包含進button,通過button來動態管理clickprocer,我覺得才是繼承真正發揮威力的地方。反之看function,基本上沒有那麼強的耦合,清晰、靈活而沒有任何負擔。

2.面對某些需求,比例GUI框架,這樣做和虛函式哪個更好?

我覺得可能是2者的組合會比較好一些。

3.如果這樣更好,為什麼市面上的大部分GUI庫都不是這種形式? 畢竟C++11也出來幾年了,沒道理不跟進啊.

庫的開發可以在內部實現用各種奇技淫巧,c++11也正是為這種內部實現提供了更多的功能。但是對外暴露的介面還是要盡可能保持簡潔和相容性。大眾一點的庫還是要考慮編譯器的支援的,小眾一點的庫也有這種方式實現的。

5樓:賈凡

個人淺見。繼承首先想到兩個用途。子類可以實現,也可以不實現。

如果用std::function的話,豈不是都要實現(如果呼叫乙個公共函式會破壞封裝型吧)?第二是,繼承還有一部分功能是多型,這個多型起來似乎有點困難。

不過閉包的概念還是很先進的,配合繼承使用效果應該很好。

6樓:

你這個如何處理父類也要對該訊息做一些處理的情況

建議模仿C#的WinForm,C++裡面可以使用fastdelegate庫

C 虛函式和C 虛函式的區別?

c 不了解。但是關於c 的說法,這樣是不對的。題主你其實糾結的不是語言,而是an implementation of c 意思是,之所以會有上面的結果,是因為你的編譯器的實現。在c 標準裡面,對於virtual 的具體實現沒有做任何要求。而virtual method table只是大多數編譯器的實...

請問虛繼承,虛函式和虛指標(vptr)之間有什麼關係?(具體問題見描述)?

阿翔 首先建議你看完inside C Object model第四章對於你理解虛函式虛繼承有很大幫助 其次,你最好明確一下,你問的虛指標vptr指的什麼,vptr常指的是vfptr,用於實現虛函式的功能,指向虛表,而還有乙個vbptr,用於實現虛繼承,指向乙個偏移量表 vfptr與vbptr各佔乙個...

建構函式不能是虛函式

ylq 建構函式不是不能是虛函式,而是完全沒意義。c 在編譯期間就能確定你要建立的物件的具體型別,而這個具體型別包含了什麼,繼承了什麼在編譯期間也是明確的,所以要構造什麼也都是明確的,根本沒必要存在虛建構函式。虛函式的存在是因為編譯期間沒法確定具體呼叫物件,才會有虛函式,虛函式表這麼個東西。 雞賊軒...