【发布时间】:2015-01-29 15:55:35
【问题描述】:
我正在使用 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字节,表示只存在一个指针。
那么这如何与新添加的虚函数一起工作?
根据this应该有两个vptr。
编辑:我按照 Serge 的建议检查了 vftable 的内存内容,确实有三个条目。 由于某种原因,它没有显示在调试器中。
干杯。
【问题讨论】:
-
@Deduplicator ... 假设您确切了解调用了哪些覆盖程序,但并非所有人都这样做。
-
很简单,whos ctor / dtor 类型中的一种就是执行。 (但请注意那里的 ctor-init-list。)
-
@madu 可能是调试器在欺骗你,只显示 vtable 的“基础”部分。整个 vtable 肯定也有一个新函数的条目,附加到它上面。
-
@Griwes:有虚拟调度,假装不这样是一个潜在的致命错误。类层次结构仅在目标派生最多的类型之下。
-
@madu is 只有一个“vptr”,但您的调试器只显示基类表中的两个条目。从您链接的问题的顶部答案:“实际上编译器将不同的 vtable 合并到一个 vtable 中”。
标签: c++ visual-studio virtual-functions vtable vptr