1.虚函数的底层原理
虚函数的底层原理主要涉及虚函数表(Virtual Table,简称V-Table)和虚函数指针(vptr)的概念。以下是虚函数底层原理的详细解释:
-
虚函数表(V-Table)
-
虚函数表是一个类的虚函数的地址表,用于索引类本身以及父类的虚函数的地址。
-
每一个含有虚函数的类(无论是其本身的,还是继承而来的)都至少有一个与之对应的虚函数表。
-
虚函数表中存放着该类所有的虚函数对应的函数指针。子类对象的虚函数表中既包含继承自基类的虚函数指针,也包含子类新增或重写的虚函数指针。
-
在多重继承的情况下,子类对象中将包含多个虚函数表的指针,分别指向对应不同基类的虚函数表。
-
-
虚函数指针(vptr)
-
为了让每个包含虚表的类的对象都拥有一个虚表指针,编译器在类中添加了一个私有指针(通常命名为
__vptr
),用来指向虚表。 -
当类的对象在创建时,这个指针的值会自动被设置为指向类的虚表。
-
只有拥有虚函数的类才会拥有虚函数指针,所以拥有虚函数的类的所有对象都会因为虚函数产生额外的开销。
-
-
虚函数调用过程
-
当通过父类指针或引用来调用虚函数时,程序会首先查找该对象的虚函数指针(vptr)。
-
然后通过虚函数指针找到对应的虚函数表(V-Table)。
-
在虚函数表中,根据函数的偏移量找到对应的函数指针。
-
最后,通过这个函数指针来调用实际的函数。
-
-
动态联编
-
虚函数的调用是通过动态联编实现的。与普通函数的
-