2017-09-04 110 views
0

在下面的這個例子中,Type有一個虛擬方法,所以它有一個vtable。但是,Type :: Bar()不是虛擬的。當調用Bar()時,調用是否也通過vtable機制,還是僅適用於Foo()?當一個類有一些虛擬方法時,是否所有的方法都使用一個虛擬表?

struct Base { 
    virtual void Foo() {} 
} 

struct Type : Base { 
    void Foo() override {} 
    void Bar() {} 
} 

Base* b = new Type(); 
Type* t = static_cast<Type*>(b); 
t->Bar(); // Does this use a vtable? 
+1

單詞'vtable'出現正是*零*在ISO C倍++標準,它是一個實現細節。因此你應該指定你感興趣的*實現。 – paxdiablo

+0

@paxdiablo你是否知道任何不使用vtables或使用vtables用於非虛函數或實現vtables的實現有很大不同? – curiousguy

+1

@curiousguy:不,我不知道。但是一個標準的全部要點是鎖定某些東西,並且無論標準沒有鎖定,實現都可以自由地做任何他們想要的事情。 – paxdiablo

回答

3

然而,Type::Bar()virtual。當致電Bar()時,呼叫是否也通過vtable機制,還是僅適用於Foo()

功能調用非virtual函數是在編譯時決定的。因此,實施選擇vtable將呼叫分派到非virtual功能沒有充分的理由。但是,該標準並不禁止使用vtable的實現,即使對於非virtual函數也是如此。

@EJP更好說:

該標準不要求實現使用虛函數表虛函數。這是一個實現細節。使用vtables沒有一個合理的實現會通過包含非虛函數來浪費空間。

+4

準確地說,該標準不需要使用'vtable'來執行'virtual'功能。這是一個實現細節。使用'vtables'的理智的實現不會因爲包含非'虛擬'功能而浪費空間。 – EJP

1

vtable的概念是C++標準中沒有進一步提及的實現細節。

但是,如果有任何類別提供的非虛擬函數肯定沒有必要將它們包括有,但完全綁定在編譯時調用

相關問題