2010-04-06 36 views
6

C++是否具有不使用vtable的接口的正確實現?C++是否有一個不使用vtable的接口的靜態多態實現?

例如

class BaseInterface{ 
public: 
virtual void func() const = 0; 
} 

class BaseInterfaceImpl:public BaseInterface{ 
public: 
void func(){ std::cout<<"called."<<endl; } 
} 

BaseInterface* obj = new BaseInterfaceImpl(); 
obj->func(); 

在最後一行調用FUNC去VTABLE找到BaseInterfaceImpl :: FUNC的FUNC PTR,但沒有任何C++的方式直接完成,由於BaseInterfaceImpl不從純粹的接口類BaseInterface除了其他任何類的子類?

謝謝。吉爾。

+0

爲什麼你會在乎它是否通過vtable? – Thomas 2010-04-06 19:14:25

+0

因爲我正在一個速度無關緊要的項目上工作。另外,我認爲vtable是完整的oo多態性的一個很好的解決方案,但是實現'接口'的矯枉過正,我希望會有一些更輕的解決方案存在.. – gilbertc 2010-04-06 19:24:39

+0

@gilbertc:我認爲這裏有一個誤解。 *接口概念的任何*「適當」實現都將經歷類似於vtable的事情。否則,動態多態將是不可能的。 – Thomas 2010-04-06 19:24:48

回答

7

是的。它通過綽號CRTP。有一個甘德。

+0

特別是,標題「靜態多態性」:http://en.wikipedia.org/wiki/Template_metaprogramming#Static_polymorphism也許你可以編輯例如到你的答案? – Thomas 2010-04-06 19:15:47

+0

@Thomas:謝謝。編輯。 – gilbertc 2010-04-06 19:22:03

+0

沒問題。我很好奇,你的代碼是甚麼優化的,即使vtable查詢的小開銷會影響性能?什麼應用?通常它被用作節省空間或用於RAII關注的實現。 – wheaties 2010-04-06 20:59:16

0

我認爲在任何語言中,除非它在編譯時知道需要調用哪個函數,否則它將不得不進入某個vtable的等價物以執行動態調度。這可能是聰明的編譯器優化的結果,或者是諸如CRTP(wheaties已經提到)等技術的結果。

+0

順便說一下,我無法理解通過vtable進行這樣的調用「不合適」的情況。 – rmeador 2010-04-06 19:18:16

+0

@thomas,rmeador:同意我不應該使用適當的詞。應該沿着「更高效」和「更輕」的界面實施方向。 – gilbertc 2010-04-06 19:26:05

相關問題