在典型的实现中,每个类都有一个虚拟表,在编译时就知道了.
在运行时,类型的指针BaseClass *可能指向一个类型为的对象BaseClass,或者指向类型为的对象的基类子对象DerivedClass,其中BaseClass是一个基类DerivedClass.这同样适用于参考文献.
在前一种情况下,虚拟呼叫会在vtable中被查找BaseClass.在后一种情况下,虚拟呼叫会在vtable中被查找DerivedClass.由于调用站点在运行时实际执行调用之前不"知道"调用哪个函数,因此称为动态或运行时多态.
同样在典型的实现中,它找出使用哪个vtable的方式是具有一个或多个虚函数的类型的对象包含指向其完整类型的vtable的"隐藏"附加字段.这是简单的继承.多重和虚拟继承增加了复杂性,但原理是相同的,该对象提供了指向应该使用的vtable的指针.
将此与非虚拟调用进行比较,其中编译器不需要使用任何vtable或知道完整对象的类型.它根据指针或引用的类型选择函数.
| 归档时间: |
|
| 查看次数: |
4829 次 |
| 最近记录: |