首页 > 代码库 > 关于派生类访问基类对象的保护变量的问题 --Coursera
关于派生类访问基类对象的保护变量的问题 --Coursera
https://class.coursera.org/pkupop-001/forum/thread?thread_id=350
郭天魁· 6 months ago
在课件中我们知道如下程序是不能编译通过的:
但是如下程序可以编译通过:
而且两个对象仅仅因为属于同一个类,就可以互相访问对方的private/protected变量,这好比“喂你怎么乱动我私人物品”“因为我们是同一个班的啊”,怎么看都很反直觉吧……
据说Java也是如此,为何要设计成这样?有没有能让我信服的解释?
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也是如此,为何要设计成这样?有没有能让我信服的解释?
Ge Yu· 6 months ago
对单个类而言,protected和private是一样的。
+ Comment
石昊悦· 6 months ago
同问类似问题,C++当中为何设计成能使一个类的内部成员函数访问所有该类变量的private成员?怎么想怎么不科学 ……就像如下的<重载一样。
class A {
public:
bool operator < (const A& o) const {
return a < o.a;
}
private:
int a;
}
+ Comment
郭文涵· 6 months ago
如果把foo放在外面还可以编译通过吗? 怀疑是编译器的bug?
还是也有可能是为了实现石同学的说法才这么设计的?
+ Comment
郭炜INSTRUCTOR· 6 months ago
这个岂止反直觉,简直感觉反人类......我暂时也不知道怎么回事。
郭天魁· 6 months ago
(活捉
Jiaying Liu / 刘家瑛INSTRUCTOR· 6 months ago
C++里,类的访问权限是针对类的,不是针对对象的。
访问权限只在编译时对编译器有效
郭文涵· 6 months ago
没理解刘老师的问题。我觉得应该是针对对象的啊。class myclass;myclass a是没法访问myclass b的私有成员啊?
+ Comment
Anonymous· 6 months ago
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/
而B a.x在 foo() 里面是试图通过B类的private界面(因为foo()是B类的成员函数)和对A类的public继承来访问x,自然是允许的。
当然C++有太多变态的设计,这个根本不算什莫。有兴趣的可以去这个网站看看
http://www.yosefk.com/c++fqa/
关于派生类访问基类对象的保护变量的问题 --Coursera
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。