Cod*_*ode 9 c++ virtual vtable vptr
假设我们有以下程序:
class A
{ public:
virtual fun(){};
};
class B:public A
{ public:
virtual fun(){};
};
int main()
{
A a1;
B b1;
}
Run Code Online (Sandbox Code Playgroud)
我的问题是,当我们运行这个程序时,会创建多少vtables和多少vptrs?
它依赖于严重的实现,但通常你会得到一个vtable对象,每个类有任何虚函数(没有虚函数或基类的类不需要它们),每个对象的一个vptr有一个vtable(指向班级的表格.
如果你有多个继承和虚拟基类,事情会变得更复杂 - 这可以通过多种方式实现.有些实现每个附加基类使用一个额外的vtable(因此每个类最终得到每个基类的vtable),而其他实现使用一个带有额外信息的vtable.这可能导致每个对象需要多个vptrs.
virtualB中的关键字是无关紧要的 - 如果函数在基类中是虚函数,则无论如何它都将在派生类中是虚拟的.
基本上,2.一个用于class A,一个用于class B(vftables)和两个用于vfptrs,一个用于a1和一个用于b1.
但是,这不是标准规定,所以你也可以没有.(通常实现使用vftables,但它没有强制要求.
注意@R.Martinho Fernandes在进行优化后,你将没有创建任何对象,所以没有vfptrs.
请注意,这严格依赖于实现。
C++ 标准没有谈到vptror vtable,虚拟机制被遗漏为编译器的实现细节。所以实际上,编译器可以在不使用vptror 的情况下实现它。vtable但是,几乎所有已知的编译器都使用vptrand实现它vtable。
综上所述,回答你的问题:
每个类都有自己的虚拟表。
而每个对象都有自己的虚拟指针。