C++ 在本例中,将创建多少个vtable和VPointer?
这是vtables上的程序。我对vtables和v指针的理解是正确的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
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实现是有文档记录的。回答这个问题从文化上来说是很有帮助的我的观点,即使你把自己限制在它的一个子类。无论如何,谢谢你的回复。