vtable 的创建时机
在 C++ 中,vtable(虚函数表)是在编译阶段创建的。当一个类包含虚函数时,编译器会为这个类生成一个 vtable。vtable 本质上是一个函数指针数组,其中每个元素指向一个虚函数的实现。这个表的布局是由编译器决定的,并且在程序的整个生命周期内是固定的。
以一个简单的类层次结构为例,假设有一个基类 Base,它有虚函数 virtFunc (),还有一个派生类 Derived 继承自 Base 并且重写了 virtFunc ()。在编译 Base 类时,编译器会为 Base 类创建一个 vtable,其中包含一个指向 Base::virtFunc () 的指针。当编译 Derived 类时,编译器会为 Derived 类创建一个 vtable,这个 vtable 中的对应位置会包含一个指向 Derived::virtFunc () 的指针。
当创建一个类的对象时,对象内部会包含一个隐藏的指针(vptr),这个指针会在对象构造时被初始化,指向该类对应的 vtable。这个初始化过程也是由编译器自动插入代码完成的。通过这种方式,当通过基类指针或引用调用虚函数时,程序可以根据对象的实际类型(由 vptr 指向的 vtable 来确定)来调用正确的虚函数实现。这种机制实现了 C++ 中的多态性,使得程序能够根据对象的实际类型动态地选择合适的函数执行路径。
一个类能否有多个 vptr
在标准 C++ 中,一个类通常只有一个 vptr(虚函数指针)。vptr 用于指向该类的虚函数表(vta
订阅专栏 解锁全文

904

被折叠的 条评论
为什么被折叠?



