一 虚函数的实现模型:
(一)虚函数的一般实现模型(1和2):
1.每个含有虚函数的class有一个virtual table,虚表里存放一堆指向virtual function的指针,虚表里每个虚函数都指派一个固定的索引值,这个索引值在整个继承体系中保持与特定的virtual function的关联。
2.每个class object添加一个指向相关virtual table的指针,通常称为vptr。
*vptr的设定和重置都由每一个class的constructor、destructor和copy assignment运算符自动完成。
*每一个class所关联的type_info object(迎来支持Runtime type identification),也由vitual table指出来,通常放在虚表的第一个slot处。
3.虚基类(virtual base class)的模型:
*VC:导入一个virtual class table。
*GCC:扩充已存在的virtual table,维护每一个virtual base class的位置。
4.指针类型决定:编译器如何解释某个特定地址中内存内容及其大小。
*derived *ptr=(derived*)&base_obj;ptr->fun():如果函数是虚函数则是基类版本;非虚函数则是派生类版本。
(二)概述:
1.识别一个class是否需要支持多态:看看它是否有任何virtual function。
2.为了支持virtual function机制,需要存储哪些信息:
*理论上:例如ptr->fun()
~ptr指向对象的真实类型,可使我们选择正确的fun()实体。
~fun()实体的位置,以便我们能调用它。
*实现上(编译器完成):
~一个字符串或数字,表示class的类型。
~一个指针(vptr),指向表格(virtual table),表格带有程序的virtual function的执行期地址。
*如何找到地址(由编译器在编译期完成):
~为了找到虚表,每一个类对象都安插一个编译器内部产生的指针,指向虚表。
~为了找到虚函数地址,每个虚函数都被分配一个虚表的索引值。
~执行期要做的是,在特定的vitual table slot中激活virtual function。
二 单继承:
(一)概述:
(1)一个class只会有一个virtual table,每一个table内含其所对应的class object中所有的virtual functions:
*继承所有base class所声明的virtual functions的函数实体。
*使用自己的函数实体,即改写继承而来的virtual function。
*增加新的virtual function,这时候virtual table的尺寸会增加一个slot。
(2)每一个virtual function都被指派一个固定的索引值,这个索引值在整个继承体系中保持与特定的virtual function的关联。
(二)如图示:
三 多重继承:
(1)多重继承下,一个derived class内含n-1个额外的virtual tables,n表示其上一层base classes的数目。
(2)针对每一个virtual table,Derived对象中都有对应的vptr。