首页 > 代码库 > 关于派生类访问基类对象的保护变量的问题 --Coursera

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

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

 
郭天魁· 6 months ago 
在课件中我们知道如下程序是不能编译通过的:
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
 
 
 
+ Comment
 
同问类似问题,C++当中为何设计成能使一个类的内部成员函数访问所有该类变量的private成员?怎么想怎么不科学 ……就像如下的<重载一样。
class A {
public:
bool operator < (const A& o) const {
return a < o.a;
}
private:
int a;
}


 
0votes received.
 
· flag
 
 
 
+ Comment
 

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

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

 
0votes received.
 
· flag
 
 
 
+ Comment
 
这个岂止反直觉,简直感觉反人类......我暂时也不知道怎么回事。
 
0votes received.
 
· flag
 
 
(活捉
 
0votes received.
 
· flag
 
 
C++里,类的访问权限是针对类的,不是针对对象的。
访问权限只在编译时对编译器有效
 
0votes received.
 
· flag
 
 
没理解刘老师的问题。我觉得应该是针对对象的啊。class myclass;myclass a是没法访问myclass b的私有成员啊?
 
0votes received.
 
· flag
 
 
+ Comment
 
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/

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