C++中public,protected,private访问范围和用法
今天本文就来十分分析一下C++中public,protected,private它们在继承中表示的一些访问范围和用法。这里我们首先要明白下面几点。
1.类的一个特征就是封装,public和private作用就是实现这一目的。所以:
用户代码(类外)可以访问public成员而不能访问private成员;private成员只能由类成员(类内)和友元访问。
2.类的另一个特征就是继承,protected的作用就是实现这一目的。所以:
protected成员可以被派生类对象访问,不能被用户代码(类外)访问。
现来看看如下示例:
#include<iostream>
#include<assert.h>
using namespacestd;
class A{
public:
int a;
A(){
a1 = 1;
a2 = 2;
a3 = 3;
a = 4;
}
void fun(){
cout <<a << endl; //正确
cout <<a1 << endl; //正确
cout <<a2 << endl; //正确,类内访问
cout <<a3 << endl; //正确,类内访问
}
public:
int a1;
protected:
int a2;
private:
int a3;
};
int main(){
A itema;
itema.a =10; //正确
itema.a1 =20; //正确
itema.a2 =30; //错误,类外不能访问protected成员
itema.a3 =40; //错误,类外不能访问private成员
system("pause");
return 0;
}
继承中的特点:
先记住:不管是否继承,上面的规则永远适用!
有public, protected, private三种继承方式,它们相应地改变了基类成员的访问属性。
1.public继承:基类public成员,protected成员,private成员的访问属性在派生类中分别变成:public, protected,private
2.protected继承:基类public成员,protected成员,private成员的访问属性在派生类中分别变成:protected,protected, private
3.private继承:基类public成员,protected成员,private成员的访问属性在派生类中分别变成:private, private,private
但无论哪种继承方式,上面两点都没有改变:
1.private成员只能被本类成员(类内)和友元访问,不能被派生类访问;
2.protected成员可以被派生类访问。
再来看看以下代码:
1.public继承
代码如下:
#include<iostream>
#include<assert.h>
using namespacestd;
class A{
public:
int a;
A(){
a1 = 1;
a2 = 2;
a3 = 3;
a = 4;
}
void fun(){
cout <<a << endl; //正确
cout <<a1 << endl; //正确
cout <<a2 << endl; //正确
cout <<a3 << endl; //正确
}
public:
int a1;
protected:
int a2;
private:
int a3;
};
class B: public A{
public:
int a;
B(int i){
A();
a = i;
}
void fun(){
cout << a <<endl; //正确,public成员
cout << a1 <<endl; //正确,基类的public成员,在派生类中仍是public成员。
cout << a2 <<endl;//正确,基类的protected成员,在派生类中仍是protected可以被派生类访问。
cout << a3 <<endl; //错误,基类的private成员不能被派生类访问。
}
};
int main(){
B b(10);
cout << b.a<< endl;
cout << b.a1<< endl; //正确
cout << b.a2<< endl; //错误,类外不能访问protected成员
cout << b.a3<< endl; //错误,类外不能访问private成员
system("pause");
return 0;
}
2.protected继承:
代码如下:
#include<iostream>
#include<assert.h>
using namespacestd;
class A{
public:
int a;
A(){
a1 = 1;
a2 = 2;
a3 = 3;
a = 4;
}
void fun(){
cout <<a << endl; //正确
cout <<a1 << endl; //正确
cout <<a2 << endl; //正确
cout <<a3 << endl; //正确
}
public:
int a1;
protected:
int a2;
private:
int a3;
};
class B: protected A{
public:
int a;
B(int i){
A();
a = i;
}
void fun(){
cout << a <<endl; //正确,public成员。
cout << a1 <<endl; //正确,基类的public成员,在派生类中变成了protected,可以被派生类访问。
cout << a2 <<endl; //正确,基类的protected成员,在派生类中还是protected,可以被派生类访问。
cout << a3 <<endl; //错误,基类的private成员不能被派生类访问。
}
};
int main(){
B b(10);
cout << b.a<< endl; //正确。public成员
cout << b.a1<< endl; //错误,protected成员不能在类外访问。
cout << b.a2 <<endl; //错误,protected成员不能在类外访问。
cout << b.a3<< endl; //错误,private成员不能在类外访问。
system("pause");
return 0;
}
3.private继承:
代码如下:
#include<iostream>
#include<assert.h>
using namespacestd;
class A{
public:
int a;
A(){
a1 = 1;
a2 = 2;
a3 = 3;
a = 4;
}
void fun(){
cout <<a << endl; //正确
cout <<a1 << endl; //正确
cout <<a2 << endl; //正确
cout <<a3 << endl; //正确
}
public:
int a1;
protected:
int a2;
private:
int a3;
};
class B: private A{
public:
int a;
B(int i){
A();
a = i;
}
void fun(){
cout <<a << endl; //正确,public成员。
cout <<a1 << endl; //正确,基类public成员,在派生类中变成了private,可以被派生类访问。
cout <<a2 << endl; //正确,基类的protected成员,在派生类中变成了private,可以被派生类访问。
cout <<a3 << endl; //错误,基类的private成员不能被派生类访问。
}
};
int main(){
B b(10);
cout << b.a<< endl; //正确。public成员
cout << b.a1<< endl; //错误,private成员不能在类外访问。
cout << b.a2<< endl; //错误, private成员不能在类外访问。
cout << b.a3<< endl; //错误,private成员不能在类外访问。
system("pause");
return 0;
}
通过以上的代码都备有较为详尽的注释,读者应该能够理解。仔细看代码中派生类B中定义了和基类同名的成员a,此时基类的a仍然存在,可以验证。
int main(){
cout << sizeof(A)<< endl;
cout << sizeof(B)<< endl;
system("pause");
return 0;
}
输出:
16
20
所以派生类包含了基类所有成员以及新增的成员,同名的成员被隐藏起来,调用的时候只会调用派生类中的成员。
如果要调用基类的同名成员,可以用以下方法
int main(){
B b(10);
cout << b.a<< endl;
cout << b.A::a<< endl;
system("pause");
return 0;
}
输出:
10
4
记得这里是在类外访问,而a在基类中是public,所以继承方式应该为public,使得a在派生类中仍然为public,在类外可以访问。
C++中public,protected,private访问范围和用法相关推荐
- C++:C++中public protected private关键字用法
C++:C++中public protected private关键字用法 笔者这里主要针对C++中public protected private关键字做一个较全面的总结.首先public prot ...
- C++中public protected private关键字
访问权限: public 公共接口 :向外界开放,可通过对象或类名访问 protected 受保护的访问:只向子类开放访问权限 ,不可通过对象访问 private私有 :只有类成员可以访问,外界不可以 ...
- C++中public protected private的区别
1. 不考虑继承关系时 本类方法使用 外部使用 private 是 否 protected 是 否 public 是 是 2. 有继承关系时 子类方法使用 外部 private 否 否 pro ...
- C++中public,protected,private派生类继承问题和访问权限问题
当一个子类从父类继承时,父类的所有成员成为子类的成员,此时对父类成员的访问状态由继承时使用的继承限定符决定. 1.如果子类从父类继承时使用的继承限定符是public,那么 (1)父类的public成员 ...
- public/protected/private简介
public/protected/private简介 #include <IOSTREAM> using namespace std; class A{ public: A(int i_, ...
- Java中public,private,protected以及default的访问权限区别
** Java中public,private,protected以及default的访问权限区别 ** 首先,从public的字面意思上就能够知道public所指的是公共的,从而我们可以知道publi ...
- C++类中的访问权限问题---public/protected/private
派生类继承了基类的全部数据成员和除了构造.析构函数之外的全部成员函数,但是这些成员的访问属性在派生的过程中通过继承方式可以来调整. 第一:private,public,protected方法的访问范围 ...
- java中public、private、protected的区别
java中public.private.protected的区别 在java中通过三个关键字public.private.protected在类的内部来进行边界的设定,这些访问指定词(access s ...
- Java关键字系列(public,protected,private)
Java关键字系列(public,protected,private) public.protected和private做为java访问权限修饰词而使用. 首先要明白,java中的每个定义(定义类.字 ...
最新文章
- Git-rebase 小筆記
- aop-xml-环绕增强
- Spring Cloud实战小贴士:Zuul统一异常处理(三)【Dalston版】
- 解压.solitairetheme8文件
- layui upload.render上传组件js动态添加html后再次渲染
- 敏捷开发团队管理系列之二:程序与测试团队I
- 设置日志不记录指定类型的文件,日志文件的切割,配置静态元素过期时间
- Java锁的升降级及synchoronized优化
- B站有哪些好的Java视频教程,看这篇就够了!
- 360影视php采集接口,基于360影视采集实例
- 海康DS-2DY5223IW-DM
- 浅析几种常见RAID模式。DVI接口种类!以及18针24针的区别!
- 为什么大多公司不要培训班培训出来的Java程序员?
- GPU共享内存小结---pycuda
- 【POJ1021】Intervals (最短路解差分约束)
- Linux 下检查 VT-d / IOMMU 是否开启
- 合肥太阳能电池片表面缺陷检测-施努卡
- Application.platform 平台
- 从软件工程师到IT猎头:我的一点经…
- ip address转换