说,我们有这样的类继承
class A
{
int a;
public:
A(){}
virtual void f1(){}
};
class B
{
int b;
public:
B(){}
virtual void f2(){}
virtual void f3(){}
};
class C: public A, public B
{
int c;
public:
C(){}
virtual void f1(){}
virtual void f2(){}
virtual void f3(){}
virtual void f4(){}
};
对象:
C c;
在对象c中,我们有vptr到一个vtable,由A + C的方法组成,另一个vtable由B的方法组成。例如x64 build:
Class C
有两个vtable实例:
我对语句感到困惑,如果一个类是多态的,那么它就有一个vtable
答案 0 :(得分:1)
C ++标准并没有说明应如何实现。它是由编译器决定的,如果它通过使用多个vtable来实现它,将vtable结合起来[以这种方式它们可以"拆分"再次,因为C
必须再次成为B
类型对象]。
在编译器中使用多个vtable是一个非常常见的解决方案,所以你至少会在MS的VC ++,GNU的g ++,LLVM / clang ++和ARM的armcc ++中看到这个解决方案。由于我不知道它在其他编译器中是如何工作的,我不能说其他编译器是否使用这种方法(很可能)。
很明显,这是一种流行的方法,但标准并没有说明应如何做到这一点。
将来,这可能会改变 - 有人可能会提出一个更好的不同解决方案(通过更好的定义 - 例如占用更少的空间,更快的访问等)