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

为何能访问派生类private成员函数?C++虚函数调用疑问

为什么基类指针能调用派生类的private虚函数?

这其实是C++里访问控制规则和虚函数动态绑定机制分离导致的有趣现象,咱们拆解开来理清楚:

核心原因:编译期检查 vs 运行期绑定

C++的访问权限检查是在编译阶段完成的,而虚函数的动态绑定是在运行阶段生效的,两者互不干扰:

  • 编译时:编译器只看你调用的是哪个类的成员名字。这里你用的是Base* b,Base类里的function()是public的,所以编译器认为这个调用完全合法,不会抛出访问权限错误。
  • 运行时:因为function()是虚函数,程序会根据b实际指向的对象(这里是Derived的实例),找到对应的派生类版本执行。而运行期不会再做访问权限的校验,所以哪怕Derived::function()是private的,依然会被正常调用。

再看反例:直接调用派生类的private函数会报错

如果咱们直接用Derived对象调用function(),比如写:

Derived d;
d.function(); // 编译报错!

这时候编译器会直接拦截,因为它能看到你调用的是Derived类的private成员,编译期就会判定访问非法——这也侧面印证了访问控制只在编译期管“名字的访问权限”,不管运行期实际绑定的函数实现。

本质:访问控制针对的是“名字”,不是“函数实现”

C++标准里的访问规则是针对成员名字的,而不是针对具体的函数实现。当你通过基类的public成员名字function()发起调用时,编译期已经认可了这个名字的访问权限;运行期动态绑定到派生类的private实现时,不会再去检查这个实现的权限——因为权限检查早就做完了。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 06:39:03