C/C++ 虚函数的实现的基本原理

通常,编译器处理虚函数的方法是:给每个对象添加一个隐藏成员。隐藏成员中保存了一个指向函数地址数组的指针,这种数组称为虚函数表。简单的说,每一个含有虚函数(无论是其本身的,还是继承而来的)的类都至少有一个与之对应的虚函数表,其中存放着该类所有的虚函数对应的函数指针。

例如:基类对象包含一个指针,该指针指向基类中所有虚函数的地址表。派生类对象将包含一个指向独立地址表的指针。

如果派生类提供了虚函数的新定义,该虚函数表将保存新函数的地址;如果派生类没有重新定义虚函数,继承类的虚函数表将保存虚函数原始版本的地址。如果派生类定义了新的虚函数,则该函数的地址也将被添加到继承类的虚函数表中。

*注意:无论类中包含的虚函数是1个还是10个,都只需要在对象中添加1个地址成员,只是表的大小不同而已。

使用虚函数时增加的成本:

 

 

  •  每一个对象都增大,增大量为存储地址的空间(给每个对象添加了一个隐藏成员。隐藏成员中保存了一个指向函数地址数组的指针);
  • 对于每个类,编译器都创建了一个虚函数表(数组);
  • 对于每一个虚函数的调用,都需要执行一项额外的功能,到表中查找该虚函数地址并执行虚函数。
posted @ 2020-06-18 21:16  每天都要吃早饭  阅读(307)  评论(0编辑  收藏  举报