【发布时间】:2014-03-26 17:21:02
【问题描述】:
比如说,我们有这样的类继承
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 中,我们有一个 vtable 的 vptr,由 A+C 的方法组成,另一个 vtable 由 B 的方法组成。例如 x64 构建:
- +0: vtable A+C
- +8: int a + 填充到 8 字节
- +16:vtable B
- +24: int b + 填充到 8 字节
- +32: int c + padding to 8 byte
Class C 有两个 vtable 实例:
- 用于调用自己的虚方法和 A 的重写方法
- 用于 B 的调用覆盖方法
我对这样的说法感到困惑,如果一个类是多态的,那么它就有一个 vtable
【问题讨论】:
-
我没有找到问题。您想知道您的陈述是否正确吗?我不相信。
-
你在回答你自己的问题,答案是肯定的……
标签: c++ visual-c++ vtable