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

时间:2016-04-14 17:53:06

标签: c++

我正在浏览虚拟功能和vtable,并对此表示怀疑。 假设我的代码如下:

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

使用范围规则,当基类派生为私有时,它的所有成员都成为派生类的私有。插入vptr(指向vtable的指针)的编译器也会变成派生类的私有吗?

1 个答案:

答案 0 :(得分:2)

它保留了它的功能ptr条目的vtable,虽然它&#34; 不正确&#34;根据{{​​1}}或private来讨论vtable,因为它是编译器的详细信息,它将始终存在并且是&#34; public&#34;。< / p>

为了进一步扩展这一点,我不熟悉关于此事的规范,但我相信(基于查看来自不同编译器的大量生成的C / C ++代码汇编)中的函数的单形化即使不需要特殊化(在运行时或其他方面),也禁止虚拟。