虚表&虚函数 的 错题

A.多继承的时候,就会可能有多张虚表

B.父类对象的虚表与子类对象的虚表没有任何关系,这是两个不同的对象

C.虚表是在编译期间生成的

chatgpt解析如下:

在这段代码中,类 AB 分别定义了虚函数 f()。类 B 继承自类 A,并且重写了 f() 函数。

关键点是,f() 函数在类 B 中被声明为私有的,而不是公共的或受保护的。尽管它是虚函数,并且可以被派生类访问和重写,但在类外部它仍然是私有的。这意味着在类 A 或其他地方无法直接通过对象访问 Bf() 函数。

但是,由于 f() 在类 B 中是虚函数,并且 pa 是指向 A 类型的指针,当通过 pa 调用 f() 时,会根据对象的实际类型来选择正确的虚函数实现。因为 pa 实际指向的是一个 B 类型的对象(即使通过 A* 指针),所以会调用 B 类中重写的 f() 函数。

因此,输出结果是 B::f()

类外调用私有虚函数

在C++中,尽管私有函数在类外部是不可访问的,但它们仍然可以是虚函数,而且可以通过基类指针或引用进行动态绑定和调用。这是因为虚函数的动态调度是通过对象内部的虚表(vtable)来实现的,而不是通过访问修饰符控制的。

具体解释如下:

  1. 虚函数机制:虚函数在C++中实现运行时多态性的关键。当一个类中的函数被声明为虚函数时(无论是公有、私有还是受保护的),编译器会在对象的内存布局中添加一个指向虚表的指针(vptr)。虚表是一个指针数组,里面存放着该类所有虚函数的地址。

  2. 访问控制:访问控制是在编译期间实施的机制,用来限制在类外部对类成员的直接访问。私有成员在类外部是不可见的,无法直接调用或访问。

  3. 通过基类指针调用私有虚函数:尽管私有虚函数本身在类外部是不可见的,但通过基类指针或引用调用虚函数时,编译器会根据指针或引用的静态类型(基类类型)来确定调用哪个类的虚表。然后,在运行时,根据对象的实际类型(派生类类型),虚表指针(vptr)会被调整为指向正确的虚表。因此,虚函数调用会动态地绑定到实际对象类型中的对应函数。

  4. 本例中的情况:在提供的代码示例中,尽管类 B 中的 f() 函数是私有的,但它仍然是虚函数,并且可以通过 A* 类型的指针 pa 进行调用。由于 pa 实际指向的对象类型是 B,因此调用 pa->f() 时会动态绑定到 B 类中重写的 f() 函数。

因此,私有虚函数的调用是通过基类指针或引用来实现的,利用了C++中的虚函数和虚表机制,而不受访问控制的限制。

“由于此时还处于对象构造阶段,多态机制还没有生效”

新增虚函数放在第一张虚表后(规定)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值