You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C++多级继承中protected虚成员函数重写的访问权限问题

C++多级继承虚函数访问权限差异原因

核心规则:C++中虚函数的访问权限检查发生在编译阶段,仅根据调用时所用指针/引用的静态类型判断,和运行时实际指向的派生类重写函数的访问权限无关。

第一种场景可正常运行的原因

  • 基类A中定义的虚函数f1()为public权限,你在main中使用A*类型的指针调用f1()时,编译器只会检查静态类型A的f1()权限:public允许外部调用,因此编译通过。
  • 运行阶段执行动态派发,实际调用的是C类的protected权限的f1(),但运行阶段没有访问权限校验逻辑,所以可以正常执行。

C++标准允许派生类重写虚函数时修改函数的访问权限,该修改只会影响以派生类类型为静态类型调用时的权限校验,不会反向影响基类的访问规则。


第二种场景编译报错的原因

  • 基类A中定义的虚函数f1()为protected权限,你在main中使用A*类型的指针调用f1()时,编译器检查静态类型A的f1()权限:protected成员仅允许类自身、友元、派生类内部访问,main函数不属于上述范畴,因此直接触发编译错误。
  • 哪怕派生类C将重写的f1()修改为public权限也不影响本次校验结果,因为编译器不会预判运行时的实际对象类型做权限检查。

如果想要第二种场景正常运行,可以将调用的静态类型改为C:

int main()
{
    C* c = new C;
    c->f1(); // 静态类型为C,f1()是public权限,编译运行都正常
}

内容的提问来源于stack exchange,提问作者amateur17

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 09:36:07