2013-03-04 88 views
0

MFC使用一種有效的方式來處理與虛函數有關的空間消耗和複雜性問題。例如,下面的圖像演示瞭如何獲取類層次結構中的函數。這種實現是節省空間的,易於理解,而且似乎是有效的。MFC消息映射和虛函數

MFC Message Map Processing

我的問題是,爲什麼核心C++不使用相同的方式,以減少編譯器的複雜性和擺脫虛函數表的?也許這個實現也有效率問題?

+1

你說的*擺脫虛函數表的*是什麼意思? MFC策略實現了基於宏的vtable,因爲公開基類中的所有消息處理程序會影響整個層次結構,但原則保持不變。 – 2013-03-04 11:38:18

回答

2

在每個編譯器中,C++多態邏輯或多或少都是相同的;每個對象都有一個vtable(相當於messageEntries),爲了得到實際的函數地址,它被解引用。

C++多態性是更好比MFC,因爲它不需要宏或任何其他擺弄;唯一的變化是關鍵字virtual,其餘代碼保持不變。

易用性如何?

// Compare 
object_ref._messageEntries[WM_PAINT](); // MFC 
// vs. 
object_ref.paint(); // C++ 

關於效率,虛擬方法添加了另一個指針解引用,這在理論上可以避免。在編寫性能關鍵代碼時,您希望減少執行操作的數量,並將運行時多態性全部轉儲。雖然內置的語言解決方案肯定不比MFC慢。

當分派事件時,MFC的解決方案專業人員會顯示。在這種情況下,具有可索引函數數組是一個很大的優點,因爲它通過組件簡化了傳遞事件。

1

如果你仔細觀察MFC類,你會看到很多虛擬方法。您在上圖中看到的是在很多GUI框架中使用的消息驅動機制 - 即使是在android中使用的新機制。

消息驅動通信的主要目的是確保所有GUI相關的東西都在GUI線程上完成。此外,所有消息正在排隊,因此它們按照某種順序進行管理。這實際上與C++的設計或應該如何設計無關。

如果你想看看框架,不使用虛擬方法,然後看看WTL/ATL和CRTP:

http://en.wikipedia.org/wiki/Curiously_recurring_template_pattern