我正在寻找一些有关虚拟表的信息,但找不到任何易于理解的内容。
有人能给我一些很好的例子和解释吗?
如果没有虚拟表,您将无法使运行时多态性发挥作用,因为对函数的所有引用都将在编译时绑定。一个简单的例子
struct Base {
virtual void f() { }
};
struct Derived : public Base {
virtual void f() { }
};
void callF( Base *o ) {
o->f();
}
int main() {
Derived d;
callF( &d );
}
函数内部callF
,你只知道o
指向一个Base
目的。但是,在运行时,代码应该调用Derived::f
(since Base::f
是虚拟的)。在编译时,编译器无法知道将要执行哪些代码o->f()
打电话,因为它不知道什么o
指着。
因此,您需要一个称为“虚拟表”的东西,它基本上是一个函数指针表。每个具有虚函数的对象都有一个“v表指针”,指向其类型的对象的虚表。
中的代码callF
上面的函数只需要查找条目Base::f
在虚拟表中(它根据对象中的虚拟表指针找到虚拟表),然后调用表项指向的函数。那might be Base::f
但也有可能它指向别的东西——Derived::f
, 例如。
这意味着由于虚拟表,您可以在运行时具有多态性,因为被调用的实际函数是在运行时通过在虚拟表中查找函数指针然后通过该指针调用该函数来确定的,而不是调用直接调用该函数(与非虚函数的情况一样)。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)