(34.1)派生类成员的访问权限

1.类的保护成员

  • 对派生类来说, 成员分为两大类:
    (1) 一类是从基类继承过来的成员;
    (2) 一类是自己新生成的成员。

  • 如果没有继承, 一个类只有两种类型的访问者: 类成员和类用户。将类划分为private和public访问级别反映对访问者的访问权限: 类用户只能访问公有成员, 类成员和友元既可以访问公有成员也可以访问私有成员。

  • 有了继承, 就有了类的第三种访问者: 派生类成员。

  • 派生类通常需要访问(一般为私有的) 基类成员, 为了允许这种访问而仍然禁止外部对基类的一般访问, 可以使用protected访问标号。 类的protected部分仍然不能被类用户访问, 但可以被派生类访问。

  • 只有基类类成员及其友元可以访问基类的private部分, 派生类不能访问基类的私有成员。
    私有永远是私有的

  • 类的保护成员用protected访问标号声明, 可以认为protected访问标号是private和public的混合:
    ①像私有成员一样, 保护成员不能被类用户访问。
    ②像公有成员一样, 保护成员可以被该类的派生类访问。

  • 如果基类声明了私有成员, 那么任何派生类都是不能访问它们的,若希望在派生类中能访问它们, 应当把它们声明为保护成员。

  • 所以如果在一个类中声明了保护成员, 就意味着该类可能要用作基类, 在它的派生类中会访问这些成员。
    说明:只有有保护成员,就有派生类

2.类的访问者示意图

在这里插入图片描述

3.派生类的访问权限

  • 派生类中包含继承来的成员和自己新增的成员, 因而产生了这两部分成员的关系和访问属性的问题。

  • 对基类成员和派生类自身的成员是按不同的原则处理的, 需要考虑以下6种情形:
    (1) 基类的成员和友元访问基类成员;
    (2) 派生类的成员和友元访问派生类自己新增的成员;
    对于第1种和第2种的情形, 可以按以下规则处理, 即: 基类的类成员和友元可以访问基类成员, 派生类的类成员和友元可以访问派生新增的类成员。
    私有成员只能被同一类中的类成员访问, 公有成员可以被类用户访问。
    (3) 基类的成员访问派生类新增的成员;
    第3种的情形, 基类的成员不能直接访问派生类的成员(因为有基类的时候尚未有派生类) , 但可以通过虚函数间接访问派生类的成员。
    (4) 类用户访问派生类的成员;
    第4种的情形, 比较明确, 类用户可以访问派生类的公有成员, 不能访问派生类任何私有的或保护的成员。
    (5) 派生类新增的成员访问基类的类成员;
    (6) 类用户访问派生类的基类成员。
    第5种和第6种的情形比较复杂, 其访问形式实际是两种形式:
    ①内部访问: 由派生类中新增成员对基类继承来的成员的访问。
    ②对象访问: 在派生类外部, 通过派生类的对象对从基类继承来的成员的访问。

  • 不同的继承方式决定了基类成员在派生类中的访问属性。
    (1) 公有继承(public inheritance)
    基类的公有成员和保护成员在派生类中保持原有访问属性, 私有成员仍为基类私有。
    (2) 私有继承(private inheritance)
    基类的所有成员在派生类中为私有成员。
    (3) 保护继承(protected inheritance)

  • 基类的公有成员和保护成员在派生类中成了保护成员, 私有成员仍为基类私有。

  • 表34-1 不同继承方式下的基类特性和访问属性

继承方式 	基类访问属性		在派生类的访问属性			派生类成员 		派生类用户		派生类的公有派生类
public		 public 			public 				可以访问 		可以访问 			可以访问
			protected 			protected 			可以访问 		不可以 				可以访问
			private 			inaccessible 		不可以 			不可以 				不可以
private 	public				 private 			可以访问			 不可以				 不可以
			protected 				private 		可以访问 		不可以 				不可以
			private 			inaccessible 		不可以 			不可以				 不可以
protected 	public 				protected 			可以访问 		不可以 				可以访问
			protected 			protected 			可以访问 		不可以 				可以访问
			private 			inaccessible 		不可以 			不可以 				不可以
  • 结论:
►无论采用何种继承方式得到的派生类, 派生类成员及其友元都不能访问基类的私有成员, 派生类外部的用户只能访问公有属性的成员。

►多级派生的情况下, 保护继承和私有继承会进一步地将基类的访问权限隐蔽成不可访问的。

►一般地, 保护继承与私有继承在实际编程中是极少使用的, 它们只在技术理论上有意义。(公有继承用的多)
  • eg:
class A
{
	int k;
	public:
		int i;
	protected:
		void f2();
		int j;
};

class B:public A//public继承
{
	int m;
	public:
		void f3();
	protected:
		void f4();
};

class C:protected B//protected继承
{
	int n;
	public:
		void f5();
};

int main()
{
return 0;
}

结果:
		 i   f2   j   k       f3  f4   m      f5   n
基类A 	公有 保护 保护 私有
派生类B 	公有 保护 保护 不可访问 公有 保护 私有
派生类C 	保护 保护 保护 不可访问 保护 保护 不可访问 公有 私有

说明:类B有7个成员

发布了510 篇原创文章 · 获赞 134 · 访问量 15万+

猜你喜欢

转载自blog.csdn.net/u011436427/article/details/103965815