一、protected成员
1. 受保护的成员的可访问性
- 对于一个类的protected成员,①该类的用户(如类对象)不能访问它,②该类的派生类的成员(及其友元)可以访问它。
- 派生类的成员及其友元不能访问其基类对象的受保护成员,它们只能访问继承到派生类对象中的受保护成员
- 派生类的成员及其友元只能访问派生类对象中的基类部分的protected成员,不能访问普通的基类对象中的protected成员
借助下面的例子加深理解:
class Base { protected: int proc = 0; }; class Derv : public Base { void set_base_false() { Base b; b.proc = 1; //[Error] ‘int Base::proc‘ is protected } void set_base_true() { Derv d; d.proc = 1; } void set_base_true2() { proc = 1; //访问该派生类继承而来的proc成员 } };
二、三种继承方式
1. 派生访问说明符
对于派生类的成员及友元能否访问其直接基类的成员没什么影响
目的:控制派生类用户(包括派生类的派生类在内)对于基类成员的访问权限
2. 继承方式不影响派生类的成员及其友元访问基类的成员
class Base { public: void pub_mem(); protected: int prot_mem; private: int priv_mem; }; //公有继承 class Pub_derv : public Base { int f1() { pub_mem(); } int f2() { return prot_mem; } int f3() { return priv_mem; } //错误:派生类不可访问private成员 }; //私有继承 class Priv_derv : private Base { int f1() { pub_mem(); } int f2() { return prot_mem; } int f3() { return priv_mem; } //错误:派生类不可访问private成员 };
3. 继承方式影响派生类对象及其派生类访问基类的成员
公有继承:派生类中(从基类中)继承而来的成员都遵循其原有的访问说明符
私有继承:派生类中(从基类中)继承而来的成员的访问说明符都是private
保护继承:派生类中(从基类中)继承而来的成员,若其在基类中的访问说明符是public,则在派生类中的访问说明符变为protected
Pub_derv d1; //公有继承而来的派生类对象d1 Priv_derv d2; //私有继承而来的派生类对象d2 d1.pub_mem(); //正确:pub_mem()在派生类中是public的 cout << d1.prot_mem << endl; //错误:prot_mem在派生类中是protected的,但类的对象无法访问protected成员 d2.pub_mem(); //错误:pub_mem()在派生类中是private的
补充:其实题目中所说的基类的成员是指继承到派生类中的基类的成员(即,派生类的成员的基类部分)
三、派生类向基类转换的可访问性
0. 影响因素
使用该转换的代码
派生类的派生访问说明符
1. D继承自B
- D公有地继承B时,用户代码才能使用派生类向基类的转换(用户代码可访问B的公有成员)
- 如果B是D的直接基类,则D的成员和友元可以使用派生类向基类的转换(D的成员和友元可访问B的公有成员)
- D不是私有地继承B时,则D的派生类的成员和友元可以使用D向B的类型转换(D的派生类的成员和友元可访问B的公有成员)
小结:对于代码中的某个给定节点来说,如果基类的公有成员是可访问的,则派生类向基类的类型转换也是可访问的。
时间: 2024-10-14 03:19:11