C++中public、protected、private

第一: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继承               public            protected         不可用 
protected继承         protected        protected          不可用 
private继承              private            private             不可用
 
更为详细一点儿的对比,如下表所示:

下面列出三种不同的继承方式的基类特性和派生类特性。

基类

派生类(能否访问)

public

private

protected

派生类类

派生类对象

派生类类

派生类对象

派生类类

派生类对象

private  继承

不能

不能

不能

不能

public   继承

不能

不能

不能

protected 继承

不能

不能

不能

不能

protected继承和private继承能降低访问权限。

为了进一步理解三种不同的继承方式在其成员的可见性方面的区别,下面从三种不同角度进行讨论。
  对于公有继承方式:
  (1) 基类成员对其对象的可见性:
  公有成员可见,其他不可见。这里保护成员同于私有成员。
  (2) 基类成员对派生类的可见性:
  公有成员和保护成员可见,而私有成员不可见。这里保护成员同于公有成员。
  (3) 基类成员对派生类对象的可见性:
  公有成员可见,其他成员不可见。
  所以,在公有继续时,派生类的对象可以访问基类中的公有成员;派生类的成员函数可以访问基类中的公有成员和保护成员。这里,一定要区分清楚派生类的对象和派生类中的成员函数对基类的访问是不同的。
  对于私有继续方式:
  (1) 基类成员对其对象的可见性:
  公有成员可见,其他成员不可见。
  (2) 基类成员对派生类的可见性:
  公有成员和保护成员是可见的,而私有成员是不可见的。
  (3) 基类成员对派生类对象的可见性:
  所有成员都是不可见的。
  所以,在私有继续时,基类的成员只能由直接派生类访问,而无法再往下继续。
  对于保护继续方式:
  这种继续方式与私有继续方式的情况相同。两者的区别仅在于对派生类的成员而言,对基类成员有不同的可见性。
  上述所说的可见性也就是可访问性。关于可访问性还有另的一种说法。这种规则中,称派生类的对象对基类访问为水平访问,称派生类的派生类对基类的访问为垂直访问。
  一般规则如下:
  公有继续时,水平访问和垂直访问对基类中的公有成员不受限制;
  私有继续时,水平访问和垂直访问对基类中的公有成员也不能访问;
  保护继续时,对于垂直访问同于公有继续,对于水平访问同于私有继续。
  对于基类中的私有成员,只能被基类中的成员函数和友元函数所访问,不能被其他的函数访问。
  基类与派生类的关系
  任何一个类都可以派生出一个新类,派生类也可以再派生出新类,因此,基类和派生类是相对而言的。
  基类与派生类之间的关系可以有如下几种描述:
  1. 派生类是基类的具体化
  类的层次通常反映了客观世界中某种真实的模型。在这种情况下,不难看出:基类是对若干个派生类的抽象,而派生类是基类的具体化。基类抽取了它的派生类的公共特征,而派生类通过增加行为将抽象类变为某种有用的类型。
  2. 派生类是基类定义的延续
  先定义一个抽象基类,该基类中有些操作并未实现。然后定义非抽象的派生类,实现抽象基类中定义的操作。例如,虚函数就属此类情况。这时,派生类是抽象的基类的实现,即可看成是基类定义的延续。这也是派生类的一种常用方法。
  3. 派生类是基类的组合
  在多继续时,一个派生类有多于一个的基类,这时派生类将是所有基类行为的组合。
  派生类将其本身与基类区别开来的方法是添加数据成员和成员函数。因此,继续的机制将使得在创建新类时,只需说明新类与已有类的区别,从而大量原有的程序代码都可以复用,所以有人称类是“可复用的软件构件”。

//其他补充:

1.关于设计模式;

2.命名空间的使用;

3.类(对象)的包含与private继承的区别与优缺点;

4.private,protected和public继承在何种情况下使用;

5.还是设计模式:UI层、逻辑层(交互层,承上启下,对象实体)、数据处理层(数据库等);

6.多态(虚函数、纯虚函数、STL、boost);

7.面向对象的思想;

8.还是设计模式。

C++中public、protected、private的更多相关文章

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

    C++中public,protected,private派生类继承问题和访问权限问题 当一个子类从父类继承时,父类的所有成员成为子类的成员,此时对父类成员的访问状态由继承时使用的继承限定符决定. 1. ...

  2. 【转载】C++中public,protected,private访问

    第一:private, public, protected 访问标号的访问范围. 假如我们约定: 类内部-----指的是当前类类型的定义中,以及其成员函数的声明和定义中: 类外部-----指的是不在当 ...

  3. C++中public,protected,private访问

    对于公有继承方式: (1)父类的public成员成为子类的public成员,允许类以外的代码访问这些成员:(2)父类的private成员仍旧是父类的private成员,子类成员不可以访问这些成员:(3 ...

  4. JAVA修饰符类型(public,protected,private,friendly)

    转自:http://www.cnblogs.com/webapplee/p/3771708.html JAVA修饰符类型(public,protected,private,friendly) publ ...

  5. php public protected private属性实例详解

    php 类中函数和类变量都有三个属性:public protected private,具体什么时候使用什么属性好纠结,特意找了个实例,这样看起来更清晰. public 表示全局,类内部外部子类都可以 ...

  6. C++ 类访问控制(public/protected/private)

    第一:private, public, protected 访问标号的访问范围. private:只能由1.该类中的函数.2.其友元函数访问. 不能被任何其他访问,该类的对象也不能访问. protec ...

  7. JAVA类型修饰符(public,protected,private,friendly)

    JAVA类型修饰符(public,protected,private,friendly) public的类.类属变量及方法.包内及包外的不论什么类均能够訪问:protected的类.类属变量及方法,包 ...

  8. 【转】C++易混知识点5:实例讲解Public Protected Private作用域,继承的区别和用意

    大学生涯,涉及到类的作用域,继承都是用的public 共有继承,当时也没想那么多,觉得共有继承多方便,多简单,反正没有太多的限制,不管是类的成员或者是基类的成员函数都可以访问.没有深究.其实这里面真是 ...

  9. [学习笔记]Java的public,protected,private,缺省的作用域

    0.引言 Java的访问指示符public,protected,private,缺省可以用来修饰类和方法. 1.作用域如下 具体如下: 作用域       当前类    同一package   子孙类 ...

  10. C++:继承访问属性(public/protected/private)

    • 公有继承(public) 公有继承在C++中是最常用的一种继承方式,我们先来看一个示例: #include<iostream> using namespace std; class F ...

随机推荐

  1. 用c写99乘法表

    int main(int argc,char **argv){ int a; for(a=1;a<=9;a++){ int b; for(b=1;b<=a;b++){ printf(&qu ...

  2. bzoj3339 bzoj3585

    两题本质是一样,只不过3585要离散化这种不修改,不强制的问题,显然先考虑离线算法这道题的思路和bzoj1878非常像考虑到如果只是求每个前缀的mex,我们是很容易扫一遍就得出来的我们设为这个位置的m ...

  3. 【最短路】【STL】CSU 1808 地铁 (2016湖南省第十二届大学生计算机程序设计竞赛)

    题目链接: http://acm.csu.edu.cn/OnlineJudge/problem.php?id=1808 题目大意: N个点M条无向边(N,M<=105),每条边属于某一条地铁Ci ...

  4. interview material

    Articles Recommended: Steve Yegge – Get That Job at Google [web] Carlos Bueno – Get That Job at Face ...

  5. Android *.db-journal

    config.xml <!-- The default journal mode to use use when Write-Ahead Logging is not active. Choic ...

  6. Introduction to Glide, Image Loader Library for Android, recommended by Google

    In the passed Google Developer Summit Thailand, Google introduced us an Image Loader Library for And ...

  7. 【Android Studio】没有先安装JDK

    如果没有先安装JDK,安装Android Studio的时候回出现下面这个界面: 请参考我整理的博客文章<JDK的下载.安装和配置>,链接:http://www.cnblogs.com/d ...

  8. Virtualization API之libvirt

    The virtualization API 之开源 libvirt探究 By Ruiy: libvirt supports Hypervisors(注,相关的hypervisors项目的权威网站已经 ...

  9. 对Spring的一些理解

    最近在复习一些关于框架的概念性问题,主要是为了最近的面试,怕被问到这些概念性的问题.不过在真正做开发的时候还是要好好理解这些框架的基本原理,以及它们的工作流程.这样,我们才能更好的使用这些框架.下面就 ...

  10. OpenMP与C++:事半功倍地获得多线程的好处

    来源:IIEEG 01-28-2011 在并行计算领域有一个广为流传的笑话——并行计算是未来之事并且永远都是.这个小笑话几十年来一直都是对的.一种类似的观点在计算机架构社区中流传,处理器时钟速度的极限 ...