【发布时间】:2014-06-02 22:57:13
【问题描述】:
这是观察虚函数表的源码:
#include <iostream>
using namespace std;
class Base
{
public:
virtual void func() {}
virtual ~Base() {}
protected:
int x;
};
class Derived : public Base
{
public:
virtual ~Derived() {}
virtual void func2() { cout << " func2() " << endl; }
protected:
int y;
};
int main()
{
Base b;
Derived d;
cout << endl;
return 0;
}
我使用vs2012并调试到“cout
【问题讨论】:
-
您正在查看
d->Base->__vfptr,但Base的vtable 不需要/放置func2。检查你是否能找到Derived的vtable。 -
但是只有一张表可以在 Base 和 Derived 之间共享。
-
这是对象 d 的整个对象模型。我找不到其他 vtable。
-
@MantoshKumar 是也不是。 vtable,作为对象本身,被扩展。如果您通过
Base(就像 OP 在调试器中所做的那样)查看它,您只会看到包含Base知道的所有内容的第一部分。您需要通过Derived查看它以查看func2的附加插槽等。这可能意味着调试器太愚蠢而无法显示所有信息,因为vtable-ptr 存储在Base-Derived实例的一部分,当调试器尝试显示它时,它会丢失d是Derived的信息,因此可以使用Derived的 vtable。
标签: c++ visual-studio-2012 inheritance