C++的访问控制机制只在编译时检查,运行时没有访问控制检查(C++编译器生成运行时机器代码时,没有考虑运行时的访问控制问题)。编辑器在编译时根据变量类型来判断何为private、public,Base的fun2()是public,所以顺利通过了编译。至于多态调用Derived的private函数fun2()是在运行时发生的,如上所述没有访问控制检查,所以产生了这种现象。
其实这也没有违背OOP对封装的设计要求。多态的特性使得基类Base的指针pBase也能指向派生类对象,此时pBase仍然是基类Base指针类型,按照Base的声明可以访问成员函数fun2();但由于fun2()是虚函数,所以调用实际指向类型(派生类)的具体实现。这个过程依然满足Base类的访问控制要求。
所以派生类的private函数是有可能被基类指针调用的,反之则不行。
from WuJiaqi