我正在浏览虚拟功能和vtable,并对此表示怀疑。 假设我的代码如下:
class base
{
public:
virtual void fun(){}
};
class derived : private base
{
public:
void fun(){}
};
使用范围规则,当基类派生为私有时,它的所有成员都成为派生类的私有。插入vptr(指向vtable的指针)的编译器也会变成派生类的私有吗?
答案 0 :(得分:2)
它保留了它的功能ptr条目的vtable,虽然它" 不正确"根据{{1}}或private
来讨论vtable,因为它是编译器的详细信息,它将始终存在并且是" public
&#34;。< / p>
为了进一步扩展这一点,我不熟悉关于此事的规范,但我相信(基于查看来自不同编译器的大量生成的C / C ++代码汇编)中的函数的单形化即使不需要特殊化(在运行时或其他方面),也禁止虚拟。