虚拟函数实现的机制

 

1 每一个产生出一队指向虚函数的指针,放在一个表格之中。这个表格被称为虚函数表(Vtbl)。

2 每一个对象被编译器添加了一个指针,指向相关的虚函数表。通常这个指针被称为Vptr。Vptr的设置(setting)和重置(resetting)由每一个类的构造函数(constructor)、析构函数(destructor)和拷贝赋值(copy assignment)运算符自动完成。每一个类所关联的type_info object(用以支持运行时类型识别,即RTTI)也通过虚函数表指出来,通常放在虚函数表的第一个记录中。

 

3 在继承的情况下,派生类会为每个有虚函数的基类添加一个vptr。(存在多个虚拟表指针,类级别上有多个虚拟表,对应不同的基类)

4 子类的成员函数被放到了第一个父类的表中。

转自:http://hi.baidu.com/05104106/blog/item/040712ad28da19014a36d655.html

 

如果对象有一个或多个虚函数,编译器将一个隐藏的指针放入对象,该指针称为vptr。这个vptr指向一个全局表,该表称为vtbl。在分发一个虚函数时,运行时系统跟随对象的vptr找到类的vtbl,然后跟随vtbl中适当的项找到方法的代码。

 

 

vtbl属于类,并且只有含虚函数类在构造函数初始化列表后生成,每个类只有一个。

vptr属于上述类的对象,实例化时在对象头部产生(这样才能计算偏移量以定位覆盖),每有一个含虚函数基类就多4个字节,并且每个对象拥有一个或更多(每个虚函数基类对象的Slicing拥有一个)。故用sizeof()来测试空数据成员对象32位系统中大小为4或其倍数(产生vptr,本质为指针)。

 

注意Slicing应用。派生类继承基类的vtbl,并依照基类virtual函数的新定义作改写。用基类指针或引用调用虚函数时,将使用派生对象对应切片的vptr,实现多态。这也是虚函数动态联编速度慢的原因,它不象普通函数一样寻址,而是通过vptr->vtbl->slot地址调用。

 

你可能感兴趣的:(object,测试,Constructor,编译器,destructor)