看这样一段代码。
出现了很有趣的结果,在main函数中,访问到了B类中的私有方法。为什么会出现这样的结果呢?
一般来说外部对象访问类的私有成员,除非是友元,否则在编译的时候就会报错,但是上面那段代码却可以正常的编译通过。
C++因为支持面向对象编程,制订了一系列实现策略的语言机制。其中,各种各样的“限制”主要是出现在编译时:因此如果直接B d; d.f(); 就会导致编译错误:编译器发现 B::f()是B类的私有成员函数,因此拒绝这样的访问。
这里我们可以区分类和对象:类是编译期的概念,也是“访问权限”、“成员数据”、“成员函数”这几个概念的“作用域”。而对象的作用域是运行期。它包括类的实例、引用和指针。
A *pA = new B();
这里 pA 是一个 A* , 所以就作为一个A类的指针参与了编译;因此从pA调用f()在编译器眼中,就是调用了A类的公开成员函数f()因此通过编译;然后在运行时,由于多态作用pA调用
编译期与运行期:C++中访问权限的奥秘

本文通过一个C++代码示例解释了编译期和运行期的区别,探讨了编译器如何处理访问权限以及在多态中如何调用私有方法。同时,讨论了在大型系统中管理log信息时,如何利用编译期判断提高运行效率,对比了编译期和运行期控制log输出的两种方法:全局变量和宏定义。
最低0.47元/天 解锁文章
1573

被折叠的 条评论
为什么被折叠?



