关于派生类访问基类对象的保护变量的问题 --Coursera

https://class.coursera.org/pkupop-001/forum/thread?thread_id=350

在课件中我们知道如下程序是不能编译通过的:
class A{
protected:
	int x;
};
class B:A{
	void foo(){
		A a;
		a.x=1;
	}
};
原因就在于x被protected了,所以在B类中不能访问A的对象的变量。
但是如下程序可以编译通过:
class A{
protected:
	int x;
};
class B:A{
	void foo(){
		B a;
		a.x=1;
	}
};
这一点非常反直觉,不是吗?明明A是B的基类,权限理应比B大,但是反而需要用B类才行。
而且两个对象仅仅因为属于同一个类,就可以互相访问对方的private/protected变量,这好比“喂你怎么乱动我私人物品”“因为我们是同一个班的啊”,怎么看都很反直觉吧……
据说Java也是如此,为何要设计成这样?有没有能让我信服的解释?
 
0votes received.
 
· flag
 
 
 

对单个类而言,protected和private是一样的。

 
0votes received.
 
· flag
 
 
 
 
同问类似问题,C++当中为何设计成能使一个类的内部成员函数访问所有该类变量的private成员?怎么想怎么不科学 ……就像如下的<重载一样。
class A {
public:
bool operator < (const A& o) const {
return a < o.a;
}
private:
int a;
}


 
0votes received.
 
· flag
 
 
 
 

如果把foo放在外面还可以编译通过吗? 怀疑是编译器的bug?

还是也有可能是为了实现石同学的说法才这么设计的?

 
0votes received.
 
· flag
 
 
 
 
这个岂止反直觉,简直感觉反人类......我暂时也不知道怎么回事。
 
0votes received.
 
· flag
 
 
(活捉
 
0votes received.
 
· flag
 
 
C++里,类的访问权限是针对类的,不是针对对象的。
访问权限只在编译时对编译器有效
 
0votes received.
 
· flag
 
 
没理解刘老师的问题。我觉得应该是针对对象的啊。class myclass;myclass a是没法访问myclass b的私有成员啊?
 
0votes received.
 
· flag
 
 
 
A a.x 在 foo() 里面是试图通过A类的public界面来访问一个局部变量a的protected成员x,自然是不行的。
而B a.x在 foo() 里面是试图通过B类的private界面(因为foo()是B类的成员函数)和对A类的public继承来访问x,自然是允许的。

当然C++有太多变态的设计,这个根本不算什莫。有兴趣的可以去这个网站看看
http://www.yosefk.com/c++fqa/

转载于:https://www.cnblogs.com/forcheryl/p/3961161.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值