C++虚函数的工作原理

mac2024-04-18  5

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

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

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

最新回复(0)