在这个例子中将创建多少个vtable和vpointers?

时间:2014-04-19 12:39:46

标签: c++ vptr

这是关于vtables的程序。我对vtable和v-pointers的理解是正确的。

Class B
{
  public:

  virtual Void Hello()
  {
    cout<<"Hello Base";
  }
};

class D: public B    
{
  public:

  virtual void Hello()
  {
    cout<<"Hello Derived";
  }
};

int main(int argc, char* argv[])
{
  D *d1 = new D();
  D *d2 = new D();
  D *d3 = new D();

  return 0;
}

在我看来,会有两个vtable,只有一个vptr。我是否正确?

3 个答案:

答案 0 :(得分:8)

标准没有定义虚拟功能的实际实现方式,只定义了它们的行为方式。所以你要求的完全取决于你正在使用的编译器。


理论上,GCC最有可能创建两个vtable(一个用于B,一个用于D)和三个vpt(每个对象实例一个d1,{{1} },d2)。

看看这里:http://en.wikipedia.org/wiki/Virtual_method_table

答案 1 :(得分:5)

您可以在编译器文档中找到实现细节。 它可能因版本而异,甚至可能在平台之间。

对于Linux上的gcc,很可能每个D实例都需要它的vptr和一个vtable。

您有3个D:

实例
  • 每个人都有自己的vptr - &gt; 3 vptr
  • 每个都指向同一个vtable。

所以3 vptr和1 vtable(B + +1 vtable,这里没用)。

这又是一个实现细节,在您非常简单的情况下,它受制于编译器优化。

答案 2 :(得分:3)

在虚拟多态的典型的基于vtable的实现中,将有:

  • 每个一个vtable,包含该类的虚函数指针和其他元数据;
  • 每个对象一个vptr ,指向该对象的动态类类型的vtable。

所以这里会有两个vtable(BD)和三个vpt(*d1*d2*d3)。除非编译器注意到你没有使用这些对象,否则它们会完全消除它们。