c++ - 当基类私有(private)派生时,编译器插入的 vptr 是否变为私有(private)?

标签 c++

我在查看虚函数和虚表时产生了疑问。 假设我有如下代码:

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

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

最佳答案

它保留了它的函数 ptr 条目的 vtable,尽管从 privatepublic 的角度谈论 vtable 是“不恰当的” ,因为它是一个编译器细节,所以它将始终存在并且是“public”。

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

关于c++ - 当基类私有(private)派生时,编译器插入的 vptr 是否变为私有(private)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36630492/

相关文章:

c++ - 从 sqlite3_stmt* 检索 sqlite3*

c++ - 为整数类型重载运算符 ^

c++ - 更新 visual studio 2017,现在出现编译错误 C7510 : 'Callback' : use of dependent template name must be prefixed with 'template'

c++ - 最大化精度的操作顺序

c++ - LoadLibrary 在 x64 上最新版本的 Visual C++ 上返回 193

c++ - QGridLayout 具有不同大小的单元格

c++ - 在 C++ 中为空 ptr-to-ptr 赋值

c++ - struct S { int align; 之间的区别}; (在 struct 关键字之后命名)和 struct { int align; } S; (结构定义后的名称)

c++ - 标准 C++ 程序执行期间的函数调用

c++ - 如何创建一个圆柱形骨骼,存储为由 2 个点(头、尾)组成的 vector ?