哪個虛擬表將成爲純虛擬功能?在基類或派生類中?位於C++中的純虛函數在哪裏?
例如,每個類中的虛擬表是什麼樣的?
class Base {
virtual void f() =0;
virtual void g();
}
class Derived: public Base{
virtual void f();
virtual void g();
}
哪個虛擬表將成爲純虛擬功能?在基類或派生類中?位於C++中的純虛函數在哪裏?
例如,每個類中的虛擬表是什麼樣的?
class Base {
virtual void f() =0;
virtual void g();
}
class Derived: public Base{
virtual void f();
virtual void g();
}
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
確實很酷的東西: ) – 2010-03-31 02:49:35
+1尼斯 - 擊敗所有猜測工作 – 2010-03-31 02:58:43
該vtable條目將在基類中。
爲什麼?因爲您可以擁有一個基類指針類型,該類型包含派生類型對象的地址,並仍然調用基類型指針變量的方法。
純虛只是告訴編譯器,派生類型必須提供自己的實現,他們不能依靠基類的實現(如果已在基類中甚至規定)
在這兩個其實。基類vtable將有一個純虛擬函數的插槽,指向類似pure_virtual_function_called()
的存根,可能會中止程序,而派生類vtable將具有指向實際實現的指針。
每個類都有自己的vtable。 f
在Base
中的條目將是NULL
,並且Derived
中的條目將是用於實現的方法的代碼的指針。
那麼,不是真的是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
相關問題:http://stackoverflow.com/questions/2549618/ – 2010-03-31 02:45:47
誰說有虛擬桌子?標準中沒有提及任何關於它們的內容,因此它們是人們想象力的一個表現:-)如果你想要編譯器特定的實現細節,你需要提到你正在使用的編譯器。 – 2010-03-31 07:11:11