【发布时间】:2019-02-18 17:12:03
【问题描述】:
当一个类中有虚函数时,编译器会为它创建一个虚表。 假设我们有上面的代码:
class A {
public:
int x;
};
class B : public A {
virtual void foo(){}
};
现在 B 有一个 vtable 而 A 没有。 如果我们有一个函数返回指向 A 的指针,该指针可以是 A 或 B,并且我们访问函数返回的对象的 x 字段。 编译器如何调整访问 x,它必须在运行时完成,但是如何?
【问题讨论】:
-
快速编译为 asm 可能会回答您的问题,但访问
x不是运行时决定的。在您呈现的层次结构中,成员 variables 没有任何虚拟内容。它与 B(或 A)的实例有一个确定的偏移量,并且不会因为foo是虚拟的而改变。 -
请注意,C++ 标准不需要使用 vtable。更多动态方案是可能的。此外,使用 vtables 的编译器,我相信所有现存的常用编译器都不需要在
B的开头添加 vtable 指针。如何做到这一点完全取决于每个编译器。除非编译器必须符合系统要求。 -
@Cheersandhth.-Alf 但是没有其他方案能比得上 vtables 的效率,以及单继承情况下的简单性。
标签: c++ inheritance polymorphism virtual vtable