Closed. This question is not reproducible or was caused by typos。它当前不接受答案。












想要改善这个问题吗?更新问题,以便将其作为on-topic用于堆栈溢出。

7年前关闭。



Improve this question




这是vtables上的程序。我是否了解在vtable和v指针上是正确的。
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。我正确吗?

最佳答案

该标准并未定义虚拟函数的实际实现方式,仅定义了其行为方式。因此,您所要求的完全取决于您使用的编译器。

理论上,GCC最有可能创建两个vtable(一个用于B,一个用于D)和三个vptrs(一个用于每个对象实例d1d2d3)。

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

10-04 10:16