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
相关产品推荐
相关产品推荐

