当基类私有派生时,编译器插入的vptr是否变为私有

Does the compiler inserted vptr becomes private when base class derived privately?

本文关键字:vptr 是否 插入 基类 派生 编译器      更新时间:2023-10-16

我在浏览虚拟函数和vtables时产生了疑问。假设我有如下代码:

class base
{ 
    public:
    virtual void fun(){}
};
class derived : private base
{ 
    public:
    void fun(){}
};

根据作用域规则,当基类派生为私有时,它的所有成员都将成为派生类的私有成员。编译器插入的vptr(指向vtable的指针)是否也会成为派生类的私有?

它保留了函数ptr项的vtable,尽管用privatepublic来谈论vtable是"不合适的",因为它是一个编译器细节,所以它将始终存在并为"public"。

为了进一步扩展这一点,我不熟悉这方面的规范,但我认为(基于对来自不同编译器的大量生成的C/C++代码的汇编)禁止在虚拟环境中对函数进行单体化,即使不需要专门化(在运行时或其他情况下)。