今天本文就来十分分析一下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访问范围和用法相关推荐

  1. C++:C++中public protected private关键字用法

    C++:C++中public protected private关键字用法 笔者这里主要针对C++中public protected private关键字做一个较全面的总结.首先public prot ...

  2. C++中public protected private关键字

    访问权限: public 公共接口 :向外界开放,可通过对象或类名访问 protected 受保护的访问:只向子类开放访问权限 ,不可通过对象访问 private私有 :只有类成员可以访问,外界不可以 ...

  3. C++中public protected private的区别

    1. 不考虑继承关系时   本类方法使用 外部使用 private 是 否 protected 是 否 public 是 是 2. 有继承关系时   子类方法使用 外部 private 否 否 pro ...

  4. C++中public,protected,private派生类继承问题和访问权限问题

    当一个子类从父类继承时,父类的所有成员成为子类的成员,此时对父类成员的访问状态由继承时使用的继承限定符决定. 1.如果子类从父类继承时使用的继承限定符是public,那么 (1)父类的public成员 ...

  5. public/protected/private简介

    public/protected/private简介 #include <IOSTREAM> using namespace std; class A{ public: A(int i_, ...

  6. Java中public,private,protected以及default的访问权限区别

    ** Java中public,private,protected以及default的访问权限区别 ** 首先,从public的字面意思上就能够知道public所指的是公共的,从而我们可以知道publi ...

  7. C++类中的访问权限问题---public/protected/private

    派生类继承了基类的全部数据成员和除了构造.析构函数之外的全部成员函数,但是这些成员的访问属性在派生的过程中通过继承方式可以来调整. 第一:private,public,protected方法的访问范围 ...

  8. java中public、private、protected的区别

    java中public.private.protected的区别 在java中通过三个关键字public.private.protected在类的内部来进行边界的设定,这些访问指定词(access s ...

  9. Java关键字系列(public,protected,private)

    Java关键字系列(public,protected,private) public.protected和private做为java访问权限修饰词而使用. 首先要明白,java中的每个定义(定义类.字 ...

最新文章

  1. Git-rebase 小筆記
  2. aop-xml-环绕增强
  3. Spring Cloud实战小贴士:Zuul统一异常处理(三)【Dalston版】
  4. 解压.solitairetheme8文件
  5. layui upload.render上传组件js动态添加html后再次渲染
  6. 敏捷开发团队管理系列之二:程序与测试团队I
  7. 设置日志不记录指定类型的文件,日志文件的切割,配置静态元素过期时间
  8. Java锁的升降级及synchoronized优化
  9. B站有哪些好的Java视频教程,看这篇就够了!
  10. 360影视php采集接口,基于360影视采集实例
  11. 海康DS-2DY5223IW-DM
  12. 浅析几种常见RAID模式。DVI接口种类!以及18针24针的区别!
  13. 为什么大多公司不要培训班培训出来的Java程序员?
  14. GPU共享内存小结---pycuda
  15. 【POJ1021】Intervals (最短路解差分约束)
  16. Linux 下检查 VT-d / IOMMU 是否开启
  17. 合肥太阳能电池片表面缺陷检测-施努卡
  18. Application.platform 平台
  19. 从软件工程师到IT猎头:我的一点经…
  20. ip address转换

热门文章

  1. 9.JAVA-抽象类定义
  2. Java(15) _Runtime类 内存方法
  3. 《毅力-如何培养自律的习惯》读后感
  4. [Windows]ping itsafe环境变量
  5. 十一.安装Redis
  6. 生产者与消费者(二)---await与 signal
  7. 使用pngquant来压缩png资源缩小apk
  8. IOS-Core Data的使用
  9. java学习笔记—国际化(41)
  10. 一、如何创建一个状态栏扩展(火狐插件扩展开发教程)