学习《TCPL》时,遇到了一个保护成员方面的问题。
问题代码:
1 #include <iostream> 2 3 using namespace std; 4 5 class A{ 6 protected: 7 char a[128]; 8 public: 9 A(){} 10 ~A(){} 11 }; 12 class B:public A{}; 13 class c: public A{ 14 void f(B* p) { 15 a[0] = 0; 16 p->a[0] = 0;//error:access to protected member of different type 17 } 18 }; 19 int main() 20 { 21 22 return 0; 23 }
用g++编译,出现编译错误:
class.cc: In member function ‘void c::f(B*)’: class.cc:7:15: error: ‘char A::a [128]’ is protected class.cc:16:5: error: within this context
分析:
在第16行中,p本意是想访问B中的保护成员A::char a[128],但是因为B 和 C都是从A继承过来的,所以,A::char a[128]对于C 来说也是C中的保护成员,故:
在C的作用域的范围内,A::char a[128]只能被C中的成员函数访问,因为p是一个B对象,故p在C中不能访问A::char a[128]
参考:
也可参考《TCPL》 P404 15.3.1