首页 新闻 会员 周边

为什么这里指向基类的指针不能访问自己的Protected成员?

0
悬赏园豆:5 [已解决问题] 解决于 2013-10-08 17:29
谁能帮忙解释一下下边注释的地方为什么错误?纠结很长时间了,这是c++ primer上的一道题。
1
struct Base 2 { 3 foo(int); 4 protected: 5 int bar; 6 double foo_bar; 7 }; 8 9 struct Derived : public Base 10 { 11 foo(string); 12 bool bar(Base *pb); 13 void foobar(); 14 protected: 15 string bar; 16 }; 17 18 bool Derived::bar(Base *pb) 19 { 20 return foo_bar == pb->foo_bar; 21 //这里错误,通过指向Base类对象的指针访问其Protected的成员foo_bar错误,应将pb定义为指向子类Derived类对象的指针 22 }
c++
可笑痴狂的主页 可笑痴狂 | 初学一级 | 园豆:197
提问于:2013-09-27 07:37
< >
分享
最佳答案
1

最好的答案就是再看一遍c++ primer。

首先你要告诉我们,为啥你觉得能访问,否则答案也是给你抄一遍书上的定义。

收获园豆:5
嗷嗷 | 小虾三级 |园豆:757 | 2013-09-27 08:28

我也只是第一遍看,新手而已,我觉的指向基类的指针,为什么不能访问自己的成员呢?改成派生类的指针为什么就可以了?

可笑痴狂 | 园豆:197 (初学一级) | 2013-09-27 08:54

@可笑痴狂: 

"我觉的指向基类的指针,为什么不能访问自己的成员呢?"

因为不是在基类的成员函数里面。

所谓封装的概念,在类的外面无法访问类的私有和保护的东西。

pb->foo_bar这行不是在Base类的成员函数,而是在derved的成员函数里面。

嗷嗷 | 园豆:757 (小虾三级) | 2013-09-27 11:21

@嗷嗷: 哦,那你能给我讲讲除了类的内部之外什么时候可以访问类的保护成员??比如在有些非友元函数中传递类对象作为形参也是不能访问的,这和java很不一样,这些访问问题搞得我头很大!还望指教! 

可笑痴狂 | 园豆:197 (初学一级) | 2013-09-27 22:07

@可笑痴狂: 这种所谓的“内”“外”我觉得应属于编译层面的控制。不是不能访问,只是编译器认为该处处于base类的外部,所以只允许你访问public的成员。

hoodlum1980 | 园豆:559 (小虾三级) | 2013-10-07 14:37
其他回答(1)
1

foo_bar == pb->foo_bar

这个句子中,pb是指传过来的其他base对象指针,不是this指针指代的对象;而派生类对象可以访问对象自己的基类成员变量是可以的,例如下面这个句子是编译正确的

foo_bar == foo_bar

18fanna | 园豆:210 (菜鸟二级) | 2013-10-06 22:26
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册