类的继承和访问控制
2016-08-18 17:29
162 查看
2016/8/18 16:49
关键概念:类的用户(primer 5th
page 545)
一个类,我们可以认为有三类用户:
普通用户,也就是类的对象,这些对象只能给访问public成员
类的实现者,也就是基类的函数(及友元),他们能够访问类的所有部分
类的派生类,派生类和普通用户类似,也是类的用户,但是它还能够访问类的protected成员
类的访问说明符 public、private、protected
类的访问说明符,是类的用户的访问控制,也就是:
普通用户只能给访问public成员
类的派生类能够访问public和protected成员
类本身和友元能够访问所有成员
派生访问说明符 public、private、protected
派生访问说明符不会控制派生类对直接基类的访问权限,只是影响派生类的用户的访问权限:
比如下面,A2函数f1中,始终不能访问a,始终能够访问b,c,不管13行中是以怎么的方式继承A1.
但是,对于A2的用户来说(A2 的对象,A2 的派生类),13行的派生访问说明符就会产生效果。
具体效果是,
如果是private继承,那么A1中所有成员在A2中相当于用类的访问说明符private修饰一样,对于A2的用户都不可访问。
如果是public继承,那么A1中的成员在A2中保在A1中的..
如果是protected继承,…
见下面。
怎么改变派生访问说明符的控制:使用using
primer 5th page 545
来自网上的总结
基本
private, public, protected 访问标号的访问范围。
private:只能由1.该类中的函数、2.其友元函数访问。
不能被任何其他访问,该类的对象也不能访问。
protected:可以被1.该类中的函数、2.子类的函数、以及3.其友元函数访问。
但不能被该类的对象访问。
public:可以被1.该类中的函数、2.子类的函数、3.其友元函数访问,
也可以由4.该类的对象访问。
注:友元函数包括3种:设为友元的普通的非成员函数;设为友元的其他类的成员函数;设为友元类中的所有成员函数。
类的继承后方法属性变化。
private 属性不能够被继承。
使用private继承,父类的protected和public属性在子类中变为private;
使用protected继承,父类的protected和public属性在子类中变为protected;
使用public继承,父类中的protected和public属性不发生改变;
注意点1
访问控制是基于类的,不是基于对象的。
这说明什么?
见 这里 :
http://blog.codingnow.com/2010/03/cpp_protected.html
友元
友元函数及友元类可以访问类的私有成员
在派生类中的友元,只能给通过派生类访问基类的受保护成员
三种继承的意义(public/private/protected)
public继承表示——A是一种(is a)B
private继承表示——A根据B实现(A is implemented in terms of B)
protected继承没有什么物理上的意义
vczh:
private继承表示“A is a B”这个隐藏的属性只有A自己能依赖
protecte表示"A is a B"这个隐藏的属性只有A和自己的子类能依赖
来自 <https://www.zhihu.com/question/49046664>
关键概念:类的用户(primer 5th
page 545)
一个类,我们可以认为有三类用户:
普通用户,也就是类的对象,这些对象只能给访问public成员
类的实现者,也就是基类的函数(及友元),他们能够访问类的所有部分
类的派生类,派生类和普通用户类似,也是类的用户,但是它还能够访问类的protected成员
类的访问说明符 public、private、protected
类的访问说明符,是类的用户的访问控制,也就是:
普通用户只能给访问public成员
类的派生类能够访问public和protected成员
类本身和友元能够访问所有成员
派生访问说明符 public、private、protected
派生访问说明符不会控制派生类对直接基类的访问权限,只是影响派生类的用户的访问权限:
比如下面,A2函数f1中,始终不能访问a,始终能够访问b,c,不管13行中是以怎么的方式继承A1.
但是,对于A2的用户来说(A2 的对象,A2 的派生类),13行的派生访问说明符就会产生效果。
具体效果是,
如果是private继承,那么A1中所有成员在A2中相当于用类的访问说明符private修饰一样,对于A2的用户都不可访问。
如果是public继承,那么A1中的成员在A2中保在A1中的..
如果是protected继承,…
见下面。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | class A1 { protected: int a; private: int b; public: int c; }; class A2 : public A1 { int b; void f1() { a; // 错误 b; c; } }; | | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | //多重继承 class B1 { public: int a; }; class B2 : private B1 { public: int b; void f1() { a; } }; class B3 : private B2 { int c; void f1() { a; // 不能被访问了 b; c; } }; |
怎么改变派生访问说明符的控制:使用using
primer 5th page 545
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 | //多重继承 class B1 { public: int a; }; class B2 : private B1 { public: int b; void f1() { a; } using B1::a; }; class B3 : private B2 { int c; void f1() { a; b; c; } }; |
来自网上的总结
基本
private, public, protected 访问标号的访问范围。
private:只能由1.该类中的函数、2.其友元函数访问。
不能被任何其他访问,该类的对象也不能访问。
protected:可以被1.该类中的函数、2.子类的函数、以及3.其友元函数访问。
但不能被该类的对象访问。
public:可以被1.该类中的函数、2.子类的函数、3.其友元函数访问,
也可以由4.该类的对象访问。
注:友元函数包括3种:设为友元的普通的非成员函数;设为友元的其他类的成员函数;设为友元类中的所有成员函数。
类的继承后方法属性变化。
private 属性不能够被继承。
使用private继承,父类的protected和public属性在子类中变为private;
使用protected继承,父类的protected和public属性在子类中变为protected;
使用public继承,父类中的protected和public属性不发生改变;
| public | protected | private |
共有继承 | public | protected | 不可见 |
私有继承 | private | private | 不可见 |
保护继承 | protected | protected | 不可见 |
注意点1
访问控制是基于类的,不是基于对象的。
这说明什么?
见 这里 :
http://blog.codingnow.com/2010/03/cpp_protected.html
友元
友元函数及友元类可以访问类的私有成员
1 2 3 4 5 6 7 8 9 10 11 | // 友元 class A { friendvoid myf(A *pa); int a; }; void myf(A *pa) { cout << pa->a << endl; } |
在派生类中的友元,只能给通过派生类访问基类的受保护成员
三种继承的意义(public/private/protected)
public继承表示——A是一种(is a)B
private继承表示——A根据B实现(A is implemented in terms of B)
protected继承没有什么物理上的意义
vczh:
private继承表示“A is a B”这个隐藏的属性只有A自己能依赖
protecte表示"A is a B"这个隐藏的属性只有A和自己的子类能依赖
来自 <https://www.zhihu.com/question/49046664>
相关文章推荐
- C++继承中的成员访问控制
- c++继承,访问控制
- C++中的类所占内存空间+继承中的成员访问控制
- 继承的访问控制--保护继承
- 继承方式和访问控制
- 继承的访问控制
- 黑马程序员——面向对象(二)---类的继承、多态性、匿名内部类、异常、包、访问控制、命名规范、jar文件
- 继承访问控制
- Java继承多态中的方法访问权限控制
- C++类的继承与多重继承的访问控制(收藏)
- 继承的访问控制--私有继承
- C++类访问控制及继承
- Unit04 - 继承的意义(下) 、 访问控制 、 static和final
- c++继承访问控制
- (zz)C++类的继承与多重继承的访问控制
- 继承 访问控制
- C++ 公有继承、保护继承和私有继承中类成员的访问权限的控制
- C++类的继承与多重继承的访问控制(网易学院)
- 类的控制访问和继承,只讨论易错点