这是关于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。我是否正确?
答案 0 :(得分:8)
标准没有定义虚拟功能的实际实现方式,只定义了它们的行为方式。所以你要求的完全取决于你正在使用的编译器。
B
,一个用于D
)和三个vpt(每个对象实例一个d1
,{{1} },d2
)。
答案 1 :(得分:5)
您可以在编译器文档中找到实现细节。 它可能因版本而异,甚至可能在平台之间。
对于Linux上的gcc,很可能每个D实例都需要它的vptr和一个vtable。
您有3个D:
实例所以3 vptr和1 vtable(B + +1 vtable,这里没用)。
这又是一个实现细节,在您非常简单的情况下,它受制于编译器优化。
答案 2 :(得分:3)
在虚拟多态的典型的基于vtable的实现中,将有:
所以这里会有两个vtable(B
和D
)和三个vpt(*d1
,*d2
和*d3
)。除非编译器注意到你没有使用这些对象,否则它们会完全消除它们。