我正在使用 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;
}
这就是我在调试时看到的:
理论上应该有两个 vptr。一个用于baseClass 的vftable 和一个用于derivedClass 以跟踪新添加的derivedClassOnlyVirtualFunc()。
但正如你所见,只有一个 vptr/vftable。但该机制运作良好。
我以为在监视窗口中看不到第二个 vptr,所以我打印了对象的大小。它是 4 个字节,表示只存在一个指针。
那么这如何与新添加的虚函数一起工作呢?
根据这个应该有两个vptr。
编辑:我按照 Serge 的建议检查了 vftable 的内存内容,确实有三个条目。
由于某种原因,它没有出现在调试器中。
干杯。