C++中通过基类指针调用派生类私有虚函数的疑问
为什么基类指针可以调用派生类的私有重写虚函数?
你的代码之所以能正常编译运行,核心原因在于C++中访问权限检查的时机和对象类型的分离:
1. 编译阶段只检查静态类型的访问权限
shapes[1]的静态类型是Shape*,而Shape类中的calculateArea是public成员。编译时编译器只会根据变量的静态类型判断访问合法性,这里完全符合规则,所以不会触发编译错误。
2. 运行阶段虚函数动态绑定不做访问检查
运行时,shapes[1]实际指向的是Rectangle对象,C++的虚函数机制会动态找到Rectangle中重写的calculateArea函数并执行。这一步不会再进行访问权限校验——因为访问检查已经在编译阶段基于静态类型完成了。
补充说明
派生类重写基类虚函数时,修改访问权限(比如从public改成private)不会影响基类接口的访问性。这是C++标准的规定,目的是保证多态机制的一致性:只要基类把某个虚函数暴露为public,外部就可以通过基类接口正常使用多态,不受派生类权限修改的影响。
你的代码运行后输出Child class,正是这种动态绑定机制的结果。
内容的提问来源于stack exchange,提问作者Hamza
相关产品推荐
相关产品推荐

