Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/145.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在本例中,将创建多少个vtable和VPointer?_C++_Vptr - Fatal编程技术网

C++ 在本例中,将创建多少个vtable和VPointer?

C++ 在本例中,将创建多少个vtable和VPointer?,c++,vptr,C++,Vptr,这是vtables上的程序。我对vtables和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* a

这是vtables上的程序。我对vtables和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;
}
B类
{
公众:
虚拟Void Hello()
{

cout该标准没有定义虚拟函数的实际实现方式,只定义它们的行为方式。因此,您所要求的完全取决于您使用的编译器


理论上,GCC最有可能创建两个VTable(一个用于
B
,一个用于
D
)和三个VPTR(一个用于对象实例
d1
d2
d3


看看这里:

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

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

您有3个D的实例:

  • 每个将有其vptr->3个vptr
  • 每个都指向相同的vtable
所以3个vptr和1个vtable(+1个vtable代表B,在这里是无用的)


同样,这是一个实现细节,在您非常简单的情况下,它需要经过编译器优化。

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

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

因此,这里将有两个VTable(用于
B
D
)和三个VPTR(用于
*d1
*d2
*d3
)。除非编译器注意到您没有使用对象,否则会将它们全部删除。

您打算让D从B继承吗?哦,谢谢!是的继承。这太本地化了-没有人会得到这个问题的答案的帮助。只需阅读编译器的ABI规范-无论您使用哪种编译器和ABI不指定-它将定义答案。不使用vtables的实现或在整个程序优化过程中消除vtables的实现将不会创建vtables和vptr。它在gcc上的行为如何?虽然这是真的,但也完全没有帮助,无法准确回答他的问题。这不是真的你的错,因为他的问题无法回答,但那是另一回事。@DeadMG:为什么没有帮助?我对一般情况做了陈述,并对一个具体情况给出了一些提示。用gcc编译并亲自查看。@DeadMG:它确定了“使用vtables和VPTR的实现”的具体情况,这就足够了,除了最聪明的学究之外,所有人都可以回答这个问题。为什么要投否决票?有什么问题吗?你回答了一个无法回答的问题,回答了它的一些具体的子案例。这并没有回答这个问题。我不同意,OP指定的gcc和gcc实现是有文档记录的。回答这个问题从文化上来说是很有帮助的我的观点,即使你把自己限制在它的一个子类。无论如何,谢谢你的回复。