谁能帮忙解释一下下边注释的地方为什么错误?纠结很长时间了,这是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++ primer。
首先你要告诉我们,为啥你觉得能访问,否则答案也是给你抄一遍书上的定义。
我也只是第一遍看,新手而已,我觉的指向基类的指针,为什么不能访问自己的成员呢?改成派生类的指针为什么就可以了?
@可笑痴狂:
"我觉的指向基类的指针,为什么不能访问自己的成员呢?"
因为不是在基类的成员函数里面。
所谓封装的概念,在类的外面无法访问类的私有和保护的东西。
pb->foo_bar这行不是在Base类的成员函数,而是在derved的成员函数里面。
@嗷嗷: 哦,那你能给我讲讲除了类的内部之外什么时候可以访问类的保护成员??比如在有些非友元函数中传递类对象作为形参也是不能访问的,这和java很不一样,这些访问问题搞得我头很大!还望指教!
@可笑痴狂: 这种所谓的“内”“外”我觉得应属于编译层面的控制。不是不能访问,只是编译器认为该处处于base类的外部,所以只允许你访问public的成员。
foo_bar == pb->foo_bar
这个句子中,pb是指传过来的其他base对象指针,不是this指针指代的对象;而派生类对象可以访问对象自己的基类成员变量是可以的,例如下面这个句子是编译正确的
foo_bar == foo_bar