Momenta C++面试题及参考答案

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

大模型大数据攻城狮

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值