转自:http://www.jb51.net/article/54224.htm

  初学C++的朋友经常在类中看到public,protected,private以及它们在继承中表示的一些访问范围,很容易搞糊涂。今天本文就来十分分析一下C++中public、protected及private用法。相信对于大家深入掌握C++程序设计会有很大的帮助。

这里我们首先要明白下面几点。

1.类的一个特征就是封装,public和private作用就是实现这一目的。所以:

用户代码(类外)可以访问public成员而不能访问private成员;private成员只能由类成员(类内)和友元访问。

2.类的另一个特征就是继承,protected的作用就是实现这一目的。所以:

protected成员可以被派生类对象访问,不能被用户代码(类外)访问。

现来看看如下示例:

#include<iostream>
#include<assert.h>
using namespace std;
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 namespace std;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 namespace std;
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 namespace std;
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++中public、protected及private用法

    深入理解C++中public.protected及private用法 这篇文章主要介绍了C++中public.protected及private用法,对于C++面向对象程序设计来说是非常重要的概念,需 ...

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

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

  3. c语言private用法,深入理解C++中public、protected及private用法

    初学C++的朋友经常在类中看到public,protected,private以及它们在继承中表示的一些访问范围,很容易搞糊涂.今天本文就来十分分析一下C++中public.protected及pri ...

  4. c语言中public 用法,深入理解C++中public、protected及private用法

    初学C++的朋友经常在类中看到public,protected,private以及它们在继承中表示的一些访问范围,很容易搞糊涂.今天本文就来十分分析一下C++中public.protected及pri ...

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

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

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

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

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

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

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

    类中的数据成员和成员函数据具有的访问权限包括:public.private.protect.friendly(包访问权限) 1.public:public表明该数据成员.成员函数是对所有用户开放的,所 ...

  9. java public_java中public,private,protected和default的区别

    类中的数据成员和成员函数据具有的访问权限包括:public.private.protect.default(包访问权限) 作用域       当前类     同一package 子孙类   其他pac ...

最新文章

  1. 为什么体制内外永远在互相羡慕着?
  2. SignalR Core尝鲜
  3. hihocoder #1136 : Professor Q's Software
  4. Oracle原理:11g中的网络配置
  5. 【转】GitHub 从单机到联机:玩转 Pull Request
  6. Django REST framework【学习内容】
  7. Dubbo(九) dubbo的配置文件加载顺序优先级
  8. 【Qt】QTableView中嵌入复选框CheckBox 的四种方法总结
  9. Spring Boot + Activiti 工作流框架搭建
  10. 基本排序看这篇就够了
  11. Alexey 大神接棒,YOLOv4 重磅来袭!快来一睹论文真容吧!| 原力计划
  12. centos 安装 Pip 的方法总结
  13. Android播播放完SD卡指定文件夹音乐之后,自动播放下一首
  14. A_A03_001 stc-isp 单片机烧录软件安装与使用
  15. 有道单词本添加js实现自动阅读单词
  16. VUE和Element-UI下拉框select实现拼音,中文搜索
  17. android多个app音量调节问题,「App 音量控制」依每个 App 的使用需求自动调整音量(Android)...
  18. [MAUI 项目实战] 音乐播放器(一):概述与架构
  19. hdu2859Phalanx
  20. Java核心技术卷一 -第五章:装箱和拆箱

热门文章

  1. python代码编写规范有哪些_Python代码编写规范(适合于小团体,低强度)
  2. Quartus II 15.0详细安装步骤
  3. Matlab | Matlab从入门到放弃(12)——基于Matlab的特征值与奇异值分解
  4. 什么是typora,什么是markdown?利用typora编写markdown文本
  5. 15年软件开发经验总结
  6. php简单实例,php实现推荐功能的简单实例
  7. python中的参数值无法传递_python中关于函数参数值传递的问题
  8. 第四范式天枢入选毕马威首届“领先消费科技50”榜单
  9. erlang精要(2)-数制
  10. 牛客多校三 B Black and white