C++虚函数

来源:互联网 发布:电脑k歌软件 编辑:程序博客网 时间:2024/06/01 23:32

一 虚函数的实现模型:

(一)虚函数的一般实现模型(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。







原创粉丝点击