我正在使用VS 2013並嘗試查看vptr和vftable如何在對象級別上工作。所以,我有以下類:單個虛擬桌面如何跟蹤新的虛擬功能?
#include<iostream>
using namespace std;
class baseClass
{
public:
void nonVirtualFunc() {}
virtual void virtualNonOverriddenFunc() {}
virtual void virtualOverriddenFunc() {}
};
class derivedClass : public baseClass
{
public:
virtual void virtualOverriddenFunc() {}
virtual void derivedClassOnlyVirtualFunc() { cout << "derivedClass" << endl; }
};
int main(int argc, char** argv) {
derivedClass derivedClassObj2;
cout << "Size of derivedClassObj: " << sizeof(derivedClassObj2) << endl;
return 0;
}
這是我所看到的在調試時:
理論上應該有兩個vptrs。一個用於baseClass的vftable,另一個用於derivedClass跟蹤新添加的derivedClassOnlyVirtualFunc()。
但是,正如你所見,只有一個vptr/vftable。但機制工作正常。
我以爲有第二個vptr,我不能在觀察窗口看到,所以我打印出對象的大小。它是4個字節,表示只有一個指針存在。
那麼這是如何與新增虛擬功能?根據this應該有兩個vptrs。
編輯:我檢查了vftable的內存內容,因爲Serge建議並且確實有三個條目。 由於某種原因,它沒有顯示在調試器中。
乾杯。
不,因爲當您創建派生對象時,vtable中的條目將被派生的虛擬函數的地址替換(如果派生的虛函數派生出來的話)。這是在構造對象時完成的,它解釋了爲什麼你不應該在構造函數/析構函數中調用虛函數。 – Borgleader 2014-12-01 15:42:48
爲什麼要在對象中有兩個?一個就足夠了,派生類vtable基於基類,爲更多虛擬添加額外條目並替換其他條目以指向新實現。 – Deduplicator 2014-12-01 15:44:05
@Borgleader:在ctors和dtors中調用虛函數很好。 – Deduplicator 2014-12-01 15:44:41