在下面的這個例子中,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?
單詞'vtable'出現正是*零*在ISO C倍++標準,它是一個實現細節。因此你應該指定你感興趣的*實現。 – paxdiablo
@paxdiablo你是否知道任何不使用vtables或使用vtables用於非虛函數或實現vtables的實現有很大不同? – curiousguy
@curiousguy:不,我不知道。但是一個標準的全部要點是鎖定某些東西,並且無論標準沒有鎖定,實現都可以自由地做任何他們想要的事情。 – paxdiablo