为了账号安全,请及时绑定邮箱和手机立即绑定

面向对象,关于继承与访问控制及this,子类为什么可以通过继承的公有方法可以间接访问父类私有方法,及相关问题

面向对象,关于继承与访问控制及this,子类为什么可以通过继承的公有方法可以间接访问父类私有方法,及相关问题

aluckdog 2019-03-01 11:15:01
C++版 #include <iostream> using namespace std; class A{ public: void p_fun(){ this->pri_fun(); } private: void pri_fun(){ cout<<"A::pri_fun"<<endl; } }; class B: public A{ }; class C: public A{ private: void pri_fun(){ cout<<"C::pri_fun"<<endl; } }; int main(){ B *b =new B(); b->p_fun(); //输出 A::pri_fun C *c =new C(); c->p_fun(); //输出 A::pri_fun return 0; } 我的问题: B只继承了A的p_fun().this也是指向B的对象,为什么this可以调用A中的私有方法? 当C中覆盖了pri_fun()后,this为什么不是调用的C中的pri_fun(),却仍然是A中的pri_fun()? 这段代码,通过php、java测试,输出结果一直,都是输出 A::pri_fun 感觉应该是对this的理解不够深入,不了解面向对象在这其中的过程。请大家解惑。
查看完整描述

3 回答

?
慕哥9229398

TA贡献1877条经验 获得超6个赞

第一B继承A的所有方法,当B调用p_fun() 其实调用继承父类A的p_fun() ,而p_fun()方法是直接访问A类pri_fun()私有方法。所以打印出来cout<<"A::pri_fun"<<endl;

第二种,虽然C继承A类,但你要看清楚,重写的pri_fun()是私有(private),及不能允许外部直接访问的,所以,你其实是调用了A类的p_fun()公有方法,所以输出内容一样。

你面向对象方面比较薄弱你要了解public,protected,private这三个访问权限

查看完整回答
反对 回复 2019-03-01
?
尚方宝剑之说

TA贡献1788条经验 获得超4个赞

先把伪代码写出来,也就是编译器会这么理解的代码:
1,对A类,共有函数:
void A::p_fun(this) { A::pri_fun(this);}
私有的函数为(注意是非虚拟的):
void A::pri_fun(this) { …… };
2,对B类,没有定义任何函数,于是继承父类的任何公有、保护的成员。
3,对于C类,虽然定义有私有的同名函数pri_fun,由于父类函数为私有,故既不存在继承,也不存在屏蔽。

对于这一句:

B *b =new B();
b->p_fun(); 

b的静态类型为 B 类,故在 B 类中查找 p_fun 函数,没找到,到其直接基类中寻找,找到了,于是调用,b->p_fun() 翻译后为:A::p_fun(&b),函数体为 A::pri_fun(&b); 注意,this指针传递进去,所指对象为 b ,并非执行到了 A 中的函数后,见到“this”符号就“截断”了变成指向 A 的对象了。况且这里 b 调用 A 的私有方法,不是 b 直接调用的,而是通过 A 的公有接口调用的。
后面一句:

C *c =new C();
c->p_fun(); 

c的静态类型为 C 类,按上面的步骤,C 类没有 p_fun,在 B 类中查找,没找到,又到 A 类中查找,于是调用:A::p_fun(&c),函数体为 A::pri_fun(&c);

这里再多说一句,如果 pri_fun 是虚拟函数,情况就不一样了,pri_fun的为代码为:X::pri_fun(this),这个 X 类型,永远跟 this 指针所指对象实际类型一致。

查看完整回答
反对 回复 2019-03-01
?
DIEA

TA贡献1820条经验 获得超2个赞

  1. B类调用p_fun()方法,但是B类中没有这个方法,所以就到他的父类,也就是A类调用;

  2. C类调用p_fun()方法,C类中也没有这个方法,所以代码就到父类A类中执行,所以这个时候this表示的是Alei,而不是C类

查看完整回答
反对 回复 2019-03-01
  • 3 回答
  • 0 关注
  • 454 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信