派生类的访问控制-“三看”原则-派生类类成员访问级别设置的原则
2015-06-14 23:38
260 查看
一、单个类的访问控制
1、类成员访问级别(public、private、protected)public:修饰的数据成员、成员函数在类的内部,类的外都都能使用。
protected:修饰的数据成员、成员函数在类的内部使用,在继承的子类中可用。
private:修饰的数据成员、成员函数只能在类的内部使用,不能在类的外部使用。
二、不同的继承方式会改变继承成员的访问属性
1)C++中的继承方式会影响子类的对外访问属性public继承:父类成员在子类中保持原有访问级别
private继承:父类成员在子类中变为private成员
protected继承:父类中public成员会变成protected
父类中protected成员仍然为protected
父类中private成员仍然为private
2)private成员在子类中依然存在,但是却无法访问到。不论种方式继承基类,派生类都不能直接使用基类的私有成员。
3)C++中子类对外访问属性表
父类成员访问级别 | ||||
继 承 方 式 | public | proteced | private | |
public | public | proteced | private | |
proteced | proteced | proteced | private | |
private | private | private | Private |
对外访问属性表比较复杂,这里总结出一个“三看”原则:
C++中的继承方式(public、private、protected)会影响子类的对外访问属性
判断某一句话,能否被访问
1)看调用语句,这句话写在子类的内部、外部
2)看子类如何从父类继承(public、private、protected)
3)看父类中的访问级别(public、private、protected)
demo
//类的继承方式对子类对外访问属性影响 #include <cstdlib> #include <iostream> using namespace std; class A { private: int a; protected: int b; public: int c; A() { a = 0; b = 0; c = 0; } void set(int a, int b, int c) { this->a = a; this->b = b; this->c = c; } }; class B : public A { public: void print() { //cout<<"a = "<<a; //err cout<<"b = "<<b; //ok cout<<"c = "<<endl; //ok } }; class C : protected A { public: void print() { //cout<<"a = "<<a; //err cout<<"b = "<<b; // ok cout<<"c = "<<endl; //ok } }; class D : private A { public: void print() { //cout<<"a = "<<a; //err cout<<"b = "<<b<<endl; //ok cout<<"c = "<<c<<endl; // ok } }; int main() { A aa; B bb; C cc; D dd; aa.c = 100; //ok bb.c = 100; // ok //cc.c = 100; // err 保护的 //dd.c = 100; // err aa.set(1, 2, 3); //ok bb.set(10, 20, 30); //ok //cc.set(40, 50, 60); // err //dd.set(70, 80, 90); //err bb.print(); //ok cc.print(); //ok dd.print(); // return 0; }
四、派生类类成员访问级别设置的原则
如何恰当的使用public,protected和private为成员声明访问级别?
1、需要被外界访问的成员直接设置为public
2、只能在当前类中访问的成员设置为private
3、只能在当前类和子类中访问的成员设置为protected,protected成员的访问权限介于public和private之间。
相关文章推荐
- Hadoop的一个变长long编码剖析
- 解放双手——Android自动化测试
- OpenCL学习笔记(三):OpenCL安装,编程简介与helloworld
- iOS开发系列--UITableView全面解析
- OpenCL学习笔记(三):OpenCL安装,编程简介与helloworld
- github使用
- 2015061410 - 推荐知乎周刊
- OpenCL学习笔记(三):OpenCL安装,编程简介与helloworld
- 《最后期限》阅读笔记(一)
- mv,Directory not empty不能目录覆盖
- Sidekiq错误处理
- mv,Directory not empty不能目录覆盖
- POJ 3281 Dining 最大流 Dinic算法
- 团队作业-第四周-面向对象程序设计
- 关于“接口”的理解
- xxx cannot be resolved to a type 错误解决方法
- 第五节:使用反射发现类型成员
- spark入门讲座
- php换行符
- Java中的对象和对象引用