有了虚函数,会在类的对象增加一个指针,该指针就是虚函数表指针_vfptr;虚表本质就是函数指针数组
,虚表里面存放着该对象的虚函数的地址
;
派生类继承有虚函数基类的对象模型
子类继承父类的虚表指针时,是对父类的虚表指针进行了拷贝。二者指向两张不同的表。子类没有重写父类的虚函数时候,子类的虚函数表和父类是完全一样的。
如果子类重写了基类中某个虚函数,用派生类自己的虚函数地址覆盖虚表中的基类的虚函数地址。
派生类自己新增的虚函数按其在派生类中的声明次序增加到派生类虚表的最后。
多态的原理:基类的指针或者引用指向谁就去用谁的虚函数表找到对应的虚函数进行调用。
问题一:同一个类的不同对象的虚函数指针是否一样?虚函数表是否一样?
是一样的。它们的对象的虚函数指针都指向同一个虚表;虚函数指针都是一样的
问题二:虚表在哪个阶段生成虚表存放在哪?
虚函数我们知道存放在虚表,但是虚表存放在哪呢?其实存放在字符常量区。虚表在编译阶段就形成了。
注意:在C++中,内置类型的地址大小是相同的,无论在32位操作系统还是64位操作系统上都是如此.内置类型包括int、double、float、char、bool等常见的基本数据类型,它们的大小在不同的编译器和操作系统下可能略有不同,但它们的地址大小始终相同,通常是4个字节或8个字节.
在32位操作系统上,内置类型的地址通常是32位,也就是4个字节.而在64位操作系统上,内置类型的地址通常是64位(8个字节).这意味着在64位操作系统上,每个指针可以表示的内存地址范围比32位操作系统更大,因此可以更高效地操作大型数据结构.