2010-03-31 61 views
7

哪個虛擬表將成爲純虛擬功能?在基類或派生類中?位於C++中的純虛函數在哪裏?

例如,每個類中的虛擬表是什麼樣的?

class Base { 

    virtual void f() =0; 
    virtual void g(); 
} 


class Derived: public Base{ 

    virtual void f(); 
    virtual void g(); 

} 
+0

相關問題:http://stackoverflow.com/questions/2549618/ – 2010-03-31 02:45:47

+0

誰說有虛擬桌子?標準中沒有提及任何關於它們的內容,因此它們是人們想象力的一個表現:-)如果你想要編譯器特定的實現細節,你需要提到你正在使用的編譯器。 – 2010-03-31 07:11:11

回答

15

g++ -fdump-class-hierarchy layout.cpp產生文件layout.cpp.class。的layout.cpp.class內容將顯示如下內容:

 
Vtable for Base 
Base::_ZTV4Base: 4u entries 
0  (int (*)(...))0 
8  (int (*)(...))(& _ZTI4Base) 
16 __cxa_pure_virtual 
24 Base::g 

Class Base 
    size=8 align=8 
    base size=8 base align=8 
Base (0x7ff893479af0) 0 nearly-empty 
    vptr=((& Base::_ZTV4Base) + 16u) 

Vtable for Derived 
Derived::_ZTV7Derived: 4u entries 
0  (int (*)(...))0 
8  (int (*)(...))(& _ZTI7Derived) 
16 Derived::f 
24 Derived::g 

Class Derived 
    size=8 align=8 
    base size=8 base align=8 
Derived (0x7ff893479d90) 0 nearly-empty 
    vptr=((& Derived::_ZTV7Derived) + 16u) 
    Base (0x7ff893479e00) 0 nearly-empty 
     primary-for Derived (0x7ff893479d90) 

去掉 '純淨' 的f改變了第五行:

 
16 Base::f 
+0

確實很酷的東西: ) – 2010-03-31 02:49:35

+0

+1尼斯 - 擊敗所有猜測工作 – 2010-03-31 02:58:43

1

該vtable條目將在基類中。

爲什麼?因爲您可以擁有一個基類指針類型,該類型包含派生類型對象的地址,並仍然調用基類型指針變量的方法。

純虛只是告訴編譯器,派生類型必須提供自己的實現,他們不能依靠基類的實現(如果已在基類中甚至規定)

1

在這兩個其實。基類vtable將有一個純虛擬函數的插槽,指向類似pure_virtual_function_called()的存根,可能會中止程序,而派生類vtable將具有指向實際實現的指針。

2

每個類都有自己的vtable。 fBase中的條目將是NULL,並且Derived中的條目將是用於實現的方法的代碼的指針。

+1

那麼,不是真的是NULL。在VC++中,條目是CRT函數的地址_purecall:http://thetweaker.wordpress.com/2010/06/03/on-_purecall-and-the-overheads-of-virtual-functions/ – 2010-06-13 21:44:22