class A protected: intx,y分 public: ·引进protected成员访问控 void f(); 制后,基类的设计者必须要 }9 慎重地考虑应该把那些成员 class B:public A 声明为protected。 ·一般情况下,应该把今后不 void h() f();//OK 太可能发生变动的、有可能 ...x...//OK 被派生类使用的、不宜对实 …y./OK 例用户公开的成员声明为 protected void g() Aa; a.f();//OK ...a.x...//Error ..a.y...//Error
class A { protected: int x,y; public: void f(); }; class B: public A { ...... void h() { f(); //OK ... x ... //OK ... y ... //OK } }; void g() { A a; a.f(); //OK ... a.x ... //Error ... a.y ... //Error } • 引进protected成员访问控 制后,基类的设计者必须要 慎重地考虑应该把那些成员 声明为protected。 • 一般情况下,应该把今后不 太可能发生变动的、有可能 被派生类使用的、不宜对实 例用户公开的成员声明为 protected!
派生类成员标识符的作用域 派生类对基类成员的访问除了受到基类的访间控制的限 制以外,还要受到标识符作用域的限制。 对基类而言,派生类成员标识符的作用域是嵌套在基类 作用域中的。 class A void f(){g();}/Error! class B:public A void g()f();}//OK
派生类成员标识符的作用域 ◼ 派生类对基类成员的访问除了受到基类的访问控制的限 制以外,还要受到标识符作用域的限制。 ◼ 对基类而言,派生类成员标识符的作用域是嵌套在基类 作用域中的。 class A { ...... void f() { g(); } //Error! class B:public A { ...... void g() { f(); } //OK } }
■ 如果派生类中定义了与基类同名的成员,则基类 的成员名在派生类的作用域内不直接可见(被隐 藏,Hidden)。访问基类同名成员时要用基类名 受限。例如 class B:public A class A/基类 int z; public: { int x,y; void f(); public: void h() void f(); {f()i/B类中的f void g(); A:f();/A类中的f Bb; b.f0;/B类中的f b.A:f);/A类中的f
◼ 如果派生类中定义了与基类同名的成员,则基类 的成员名在派生类的作用域内不直接可见(被隐 藏,Hidden)。访问基类同名成员时要用基类名 受限。例如: class B: public A { int z; public: void f(); void h() { f(); //B类中的f A::f(); //A类中的f } }; B b; b.f(); //B类中的f b.A::f(); //A类中的f class A //基类 { int x,y; public: void f(); void g(); };
■ 即使派生类中定义了与基类同名但参数不同的成 员函数,基类的同名函数在派生类的作用域中也 是不直接可见的,可以用基类名受限方式来使用 之: class B:public A class A/基类 { int Z; { intx,y分 public: public: void f(nt);/不是重载A的f! void h() void f(); {f(1);/OK void g(); f();//Error A:fO;//OK Bb; b.f(1);/OK b.f();//Error b.A::f();//OK
◼ 即使派生类中定义了与基类同名但参数不同的成 员函数,基类的同名函数在派生类的作用域中也 是不直接可见的,可以用基类名受限方式来使用 之: class B: public A { int z; public: void f(int); //不是重载A的f! void h() { f(1); //OK f(); //Error A::f(); //OK } }; ...... B b; b.f(1); //OK b.f(); //Error b.A::f(); //OK class A //基类 { int x,y; public: void f(); void g(); };
也可以在派生类中使用using声明把基类中某个 的函数名对派生类开放: class B:public A class A/基类 int z; int x,y; public: public: using A::f; void f(); void f(int); void g(); void h() {f(1);/OK f);/OK,等价于A:f): }习 Bb; b.f(1);/0K b.f);/OK,等价于b.A:f);
◼ 也可以在派生类中使用using声明把基类中某个 的函数名对派生类开放: class B: public A { int z; public: using A::f; void f(int); void h() { f(1); //OK f(); //OK,等价于A::f(); } }; ...... B b; b.f(1); //OK b.f(); //OK,等价于b.A::f(); class A //基类 { int x,y; public: void f(); void g(); };