虚函数

首先通过虚函数实现晚捆绑,这里面所有的工作是编译器完成的,编译器安装必要的晚捆绑机制。

关键字virtual告诉编译器不应当现在早捆绑,而是安装一个晚捆绑必须的所有机制。

通用的实现方法是,编译器为每个虚函数的类创建一个表,在这个表,编译器放置特定类的虚函数的地址。在每个带有虚函数的类中,编译器秘密地放置一个指针,成为vpointer,指向这个对象的虚函数表。

当通过基类指针做函数调用时(多态调用时),编译器静态的插入能取得这个vpointer并在虚函数表找到函数地址的代码。这样就可以实现晚捆绑了。

 

 如上图所示,没有任何虚函数的类是成员变量的数据大小,有一个和多个虚函数的大小都增加了一个void*的大小。

 这是因为编译器发现有一个或者多个虚函数时,编译器就会在插入单个指针,这个指针指向的是这个类在虚函数表的起始地址。

虚函数表的建立过程:

   每当创建一个包含虚函数的类或包含虚函数的类派生的一个类时,编译器就会为这个类创建一个唯一的VTABLE(虚函数表),在这个表中,编译器放置了这个类中或者它的基类中所有的声明为virtual的函数的地址

   相当于基类和自己类的虚函数都会放在里面,如果派生类没有重写基类的虚函数就会使用基类的地址。

 

posted @ 2020-07-07 21:04  凌青语  阅读(111)  评论(0编辑  收藏  举报