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

大学生涯,涉及到类的作用域,继承都是用的public 共有继承,当时也没想那么多,觉得共有继承多方便,多简单,反正没有太多的限制,不管是类的成员或者是基类的成员函数都可以访问。没有深究。其实这里面真是涉及到了C++面向对象设计当中的封装特性。只暴露那些需要的成员和成员函数,不必过多曝露所有的成员。

转载请注明出处:http://blog.csdn.net/elfprincexu

第一:private、public、protected访问的范围。

private:只能由1、该类中的函数;2、其友元函数访问。不能被其他任何访问,该类对象也不能访问。

private members are accessible in the class that defines them
    protected:可以被1、该类中的函数;2、子类的函数;3其友元函数访问。该类对象不能访问

protected memebers are accessible in the class that defines them and in classes that inherit from that class (at least protected inheritance). Instances of this class can not access them
    public
:可以被1、该类中的函数;2、子类的函数;3、其友元函数;4该类的对象访问。

public memebers are accessible in the class that defines them, in classes that inherit from that class (at least protected inheritance), and also accessible by instances of the class that defines them.

注:友元函数包括3中,设为友元函数的普通非成员函数;设为友元的其他类的成员函数;设为友元类中的所有成员函数

第二:类的继承后方法属性的变化。

private属性不能够被继承,对所有子类都是不可见的!

使用private继承,父类的protected和public属性在子类中变为private;

使用protected继承,父类的protected和public属性在子类中变为protected;

使用public继承,父类的protected和public属性不发生变化;

不多说,先来看看下面这个例子:

1 #include<iostream>  
 2 using namespace std;  
 3 //////////////////////////////////////////////////////////////////////////  
 4 class A       //父类  
 5 {  
 6 private:  
 7     int privatedateA;  
 8 protected:  
 9     int protecteddateA;  
10 public:  
11     int publicdateA;  
12 };  
13 //////////////////////////////////////////////////////////////////////////  
14 class B :public A      //基类A的派生类B(共有继承)  
15 {  
16 public:  
17     void funct()  
18     {  
19         int b;  
20         b=privatedateA;   //error:基类中私有成员在派生类中是不可见的  
21         b=protecteddateA; //ok:基类的保护成员在派生类中为保护成员  
22         b=publicdateA;    //ok:基类的公共成员在派生类中为公共成员  
23     }  
24 };  
25 //////////////////////////////////////////////////////////////////////////  
26 class C :private A  //基类A的派生类C(私有继承)  
27 {  
28 public:  
29     void funct()  
30     {  
31         int c;  
32         c=privatedateA;    //error:基类中私有成员在派生类中是不可见的  
33         c=protecteddateA;  //ok:基类的保护成员在派生类中为私有成员  
34         c=publicdateA;     //ok:基类的公共成员在派生类中为私有成员  
35     }  
36 };  
37 //////////////////////////////////////////////////////////////////////////  
38 class D :protected A   //基类A的派生类D(保护继承)  
39 {  
40 public:  
41     void funct()  
42     {  
43         int d;  
44         d=privatedateA;   //error:基类中私有成员在派生类中是不可见的  
45         d=protecteddateA; //ok:基类的保护成员在派生类中为保护成员  
46         d=publicdateA;    //ok:基类的公共成员在派生类中为保护成员  
47     }  
48 };  
49 //////////////////////////////////////////////////////////////////////////  
50 int main()  
51 {  
52     int a;  
53    
54     B objB;  
55     a=objB.privatedateA;   //error:基类中私有成员在派生类中是不可见的,对对象不可见  
56     a=objB.protecteddateA; //error:基类的保护成员在派生类中为保护成员,对对象不可见  
57     a=objB.publicdateA;    //ok:基类的公共成员在派生类中为公共成员,对对象可见  
58    
59     C objC;  
60     a=objC.privatedateA;   //error:基类中私有成员在派生类中是不可见的,对对象不可见  
61     a=objC.protecteddateA; //error:基类的保护成员在派生类中为私有成员,对对象不可见  
62     a=objC.publicdateA;    //error:基类的公共成员在派生类中为私有成员,对对象不可见  
63    
64     D objD;  
65     a=objD.privatedateA;   //error:基类中私有成员在派生类中是不可见的,对对象不可见  
66     a=objD.protecteddateA; //error:基类的保护成员在派生类中为保护成员,对对象不可见  
67     a=objD.publicdateA;    //error:基类的公共成员在派生类中为保护成员,对对象不可见  
68    
69     return 0;

70 }

pasting

pasting

公有继承(public)、私有继承(private)、保护继承(protected)是常用的三种继承方式。
1. 公有继承(public)
公有继承的特点是基类的公有成员和保护成员作为派生类的成员时,它们都保持原有的状态,而基类的私有成员仍然是私有的,不能被这个派生类的子类所访问。
2. 私有继承(private)
私有继承的特点是基类的公有成员和保护成员都作为派生类的私有成员,并且不能被这个派生类的子类所访问。
3. 保护继承(protected)
保护继承的特点是基类的所有公有成员和保护成员都成为派生类的保护成员,并且只能被它的派生类成员函数或友元访问,基类的私有成员仍然是私有的。

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



public      protected     private

共有继承      public       protected     不可见
私有继承      private      private      不可见
保护继承      protected     protected     不可见

在上图中:

  1. 基类成员对派生类都是:共有和保护的成员是可见的,私有的的成员是不可见的。
  2. 基类成员对派生类的对象来说:要看基类的成员在派生类中变成了什么类型的成员。如:私有继承时,基类的共有成员和私有成员都变成了派生类中的私有成员,因此对于派生类中的对象来说基类的共有成员和私有成员就是不可见的。
时间: 2024-08-28 19:42:27

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

php public protected private属性实例详解

php 类中函数和类变量都有三个属性:public protected private,具体什么时候使用什么属性好纠结,特意找了个实例,这样看起来更清晰. public 表示全局,类内部外部子类都可以访问:private 表示私有的,只有本类内部可以使用:protected 表示受保护的,只有本类或子类或父类中可以访问: <?php//父类class father{ public function a(){ echo "function a"; } private functio

【转】C++易混知识点3. New Operator, Operator New, Placement New 实例分析,比较区别

我们知道,C++中引入了New 这个内置符号,很大方便了指针的使用,程序员不必关注与这块堆上新分配的内存是如何来的,如何初始化的,然后如何转换为我们想要的类型指针的.现在,我们重点来分析下这个NEW内置符号背后的步骤和所调用到的函数.这里面涉及到new operator, operator new, placement new. 转载请注明出处: http://blog.csdn.net/elfprincexu 1. New Operator (__type__ * a = new a();)

【转】 C++易混知识点4: 自己编写一个智能指针(Reference Counting)学习auto_ptr和reference counting

这篇文章建大的介绍了如何编写一个智能指针. 介绍: 什么是智能指针?答案想必大家都知道,智能指针的目的就是更好的管理好内存和动态分配的资源,智能指针是一个智能的指针,顾名思义,他可以帮助我们管理内存.不必担心内存泄露的问题.实际上,智能指针是一个行为类似于指针的类,通过这个类我们来管理动态内存的分配和销毁.方便客户端的使用.相比于一般指针,智能指针主要体现在它使用的容易和便捷性. 转载请注明出处: http://blog.csdn.net/elfprincexu 使用一般指针的问题: 一般情况下

【转】 C++易混知识点2. 函数指针和指针函数的区别

我们时常在C++开发中用到指针,指针的好处是开销很小,可以很方便的用来实现想要的功能,当然,这里也要涉及到指针的一些基本概念.指针不是基本数据类型,我们可以理解他为一种特殊类型的对象,他占据一定空间,但是所带来的好处就是C++如此强大的深层次原因了. 转载请注明出处: http://blog.csdn.net/elfprincexu 1. 指针函数, ( __type__ * func( void, int,) ) 顾名思义,他是一个函数,只不过和一般函数区分的原因是它返回的是一个指针.int*

JavaScript易错知识点整理

本文是我学习JavaScript过程中收集与整理的一些易错知识点,将分别从变量作用域,类型比较,this指向,函数参数,闭包问题及对象拷贝与赋值这6个方面进行由浅入深的介绍和讲解,其中也涉及了一些ES6的知识点. JavaScript知识点 1.变量作用域 var a = 1; function test() { var a = 2; console.log(a); // 2 } test(); 上方的函数作用域中声明并赋值了a,且在console之上,所以遵循就近原则输出a等于2. var a

JavaScript 易错知识点整理

本文是我学习JavaScript过程中收集与整理的一些易错知识点,将分别从变量作用域,类型比较,this指向,函数参数,闭包问题及对象拷贝与赋值这6个方面进行由浅入深的介绍和讲解,其中也涉及了一些ES6的知识点. JavaScript知识点 1.变量作用域 var a = 1;function test() { var a = 2; console.log(a); // 2} test();上方的函数作用域中声明并赋值了a,且在console之上,所以遵循就近原则输出a等于2. var a =

多线程之间的通信实例讲解

                 多线程之间的通信实例讲解对于线程来说,说白了,就是一个函数,如果大家对于这章函数都有理解,那我对于操作系统,线程和进程间的通信会有一个新的认识!接下来我会对每一行代码进行注释,在此过程中,大家也可以对c语言有一个崭新的认识. 第一个函数,创建两个线程. #include <stdio.h>#include <pthread.h>    这个头函数要包含,因为我们后续用的函数都是系统调用,因此需要申请头函数   这样在编译的时候,就可以找到此函数的源

jQuery选择器与JavaScript易出错知识点

一.jQuery选择器 基本选择器 1.Id(根据给定的ID匹配一个元素.如果选择器中包含特殊字符,可以用两个斜杠转义.) jQuery代码为$("#myclass") 若有特殊字符则 HTML代码为<span id="myclass[1]" jQuery代码为$("#myclass\\[1\\]") 2.Class(一个用以搜索的类.一个元素可以有多个类,只要有一个符合就能被匹配到) jQuery代码为$(".myclass&q

常问易混淆知识点(嵌入式)

b 一.知识点1 a) 关键字volatile在编译时有什么含义?并给出三个不同使用场景的例子(可以伪代码或者文字描述).b) C语言中static关键字的具体作用有哪些 ?c) 请问下面三种变量声明有何区别?请给出具体含义int const *p;int* const p;int const* const p; a) 用volatile关键字定义变量,相当于告诉编译器,这个变量的值会随时发生变化,每次使用时都需要去内存里 重新读取它的值,并不要随意针对它作优化. 建议使用volatile变量的