C++虚函数的工作原理

通常,编译器处理虚函数的方法是:给每一个对象添加一个隐藏成员,这个隐藏成员中保存了指向函数地址数组的指针。这种数组叫做虚函数表,虚函数表中存储了为类对象进行声明的虚函数的地址。
C++虚函数的工作原理
C++虚函数的工作原理
以上面两个类为例子,B继承自A
C++虚函数的工作原理
基类对象包含一个指针,指向基类中所有虚函数的地址表。
派生类对象将包含一个指向独立地址表的指针,如果派生类提供了虚函数的新定义,该虚函数表将保存新函数的地址.反之,则保存该函数原始版本的地址.如果派生类定义了新的虚函数,则该函数的地址也将被添加到虚函数表中.

调用虚函数时过程如下:
1.程序查看存储在对象中的虚函数表地址,然后转向相应的函数地址表。如果使用类声明中定义的第一个虚函数,则程序使用数组中的第一个虚函数地址,并执行该地址的函数。

使用虚函数的缺点如下:
1.每个对象都将增大,增大量为存储地址的空间。
2.对于每个类,编译器都创建一个虚函数地址表。
3.每次调用,都需要到表中查找地址.