C++ 面向对象的三个特点--继承与封装(一)

面试的时候经常会有很多概念性的东西,许久不用都会很生疏,特意整理一下方便自己以后不记得了可以查看一下,也顺便帮助自己复习一下。

  • 概念

继承是面向对象程序设计的一个重要特性,它允许在既有类的基础上创建新的类,新类可以从一个或者是多个既有类中继承函数和数据,还可以重新定义或加入新的数据和函数。

  • 基类成员在派生类中的访问属性归纳

我们了解类的成员可以有public、protected、private三种访问属性,类的自身成员可以访问类中的任何成员,但是通过对象访问的话,就只能访问类的public(公有)成员。

类的继承方式有public(公有继承)、protected(保护继承)、private(私有继承)。

在派生类中,基类成员的访问属性可以归纳为四种:不可直接访问,public,protected,private。


在基类中的访问属性


继承方式


在派生类中的访问属性


private


public


不可直接访问


private


private


不可直接访问


private


protected


不可直接访问


protected


public


protected


protected


private


private


protected


protected


protected


public


public


public


public


private


private


public


protected


protected

归纳一下就是:

(1). 基类的私有成员

无论是那种继承方式,基类的私有成员都不允许派生类继承。也就是派生类中不可直接访问的。

(2). 基类的保护成员

公有继承时,基类中得所有公有成员在派生类中以保护成员的身份出现。

保护继承时,基类中得所有保护成员在派生类中以保护成员的身份出现。

私有继承时,基类中得所有私有成员在派生类中以私有成员的身份出现。

(3). 基类的公有成员

公有继承时,基类中得所有公有成员在派生类中以公有成员的身份出现。

保护继承时,基类中得所有保护成员在派生类中以保护成员的身份出现。

私有继承时,基类中得所有私有成员在派生类中以私有成员的身份出现。

  • 派生类对基类成员的访问规则

我们都知道,派生类对基类的访问形式主要有以下两种方式:(1).内部访问,有派生类新增的成员对基类继承过来的成员进行访问。(2).对象访问,在派生类的外部,通过定义派生类的对象来对基类继承来得成员进行访问。

那我们来分析三种继承方式下面,派生类对基类的访问规则。

i. 私有继承的访问规则


基类成员


Private成员


Public成员


Protected成员


内部访问


不可访问


可以访问


可以访问


对象访问


不可访问


不可访问


不可访问

首先,我们根据一个具体的例子来看一下。

 1 //基类
 2 class Base
 3 {
 4 public:
 5     Base(int a, int b, int c): x(a),y(b),z(c)
 6     {}
 7     virtual ~Base(void);
 8
 9     int x;
10     void printX()
11     {
12        printZ();     // 间接的访问基类的private成员
13        printf("X = %d\n", x);
14     }
15
16 protected:
17     int y;
18     void printY()
19     {
20        printf("Y = %d\n", y);
21     }
22
23 private:
24     int z;
25     void printZ()
26     {
27        printf("Z = %d\n", z);
28     }
29 };
30
31 //派生类
32 #include "base.h"
33
34 class Derivel :
35     private Base
36 {
37 public:
38     Derivel(int a, int b, int c):Base(a,b,c)
39     {}
40     virtual ~Derivel(void);
41
42     void show()
43     {
44        printX();     // 正确,基类的公有成员,派生类内部访问可能
45        printY();     // 正确,基类的保护成员,派生类内部访问可能
46        printZ();     // 错误,基类的私有成员,派生类不能内部访问
47     }
48 };
49
50 // main
51 #include "Base.h"
52 #include "Derivel.h"
53
54 int _tmain(int argc, _TCHAR* argv[])
55 {
56     Derivel a(1,2,3);
57
58   a.printX();
59     // 错误,基类的公有成员,私有继承后作为派生类的私有成员,不能外部访问
60   a.printY();
61     // 错误,基类的保护成员,私有继承后作为派生类的私有成员,不能外部访问
62   a.printZ();
63     // 错误,基类的私有成员,私有继承后作为派生类的私有成员,不能外部访问
64   a.show();
65    return 0;
66 }

总结:

当类的继承方式为私有继承的时候,基类的public和protected成员被继承后作为派生类的私有成员。在类的外部通过派生类的对象无法访问,但在派生类的内部是可以直接访问的。基类的private成员在派生类的内部是不能直接访问的,在派生类的外部同样也是不能访问的。如果你想访问的话,可以通过基类提供的public成员函数间接访问。

ii. 公有继承的访问规则


基类成员


Private成员


Public成员


Protected成员


内部访问


不可访问


可以访问


可以访问


对象访问


不可访问


可以访问


不可访问

首先,我们根据一个具体的例子来看一下。

 1 //基类
 2 class Base
 3 {
 4 public:
 5     Base(int a, int b, int c): x(a),y(b),z(c)
 6     {}
 7     virtual ~Base(void);
 8
 9     int x;
10     void printX()
11     {
12        printZ();     // 间接的访问基类的private成员
13        printf("X = %d\n", x);
14     }
15
16 protected:
17     int y;
18     void printY()
19     {
20        printf("Y = %d\n", y);
21     }
22
23 private:
24     int z;
25     void printZ()
26     {
27        printf("Z = %d\n", z);
28     }
29 };
30
31 //派生类
32 #include "base.h"
33
34 class Derivel :
35     public Base
36 {
37 public:
38     Derivel(int a, int b, int c):Base(a,b,c)
39     {}
40     virtual ~Derivel(void);
41
42     void show()
43     {
44        printX();     // 正确,基类的公有成员,派生类内部访问可能
45        printY();     // 正确,基类的保护成员,派生类内部访问可能
46        printZ();     // 错误,基类的私有成员,派生类不能内部访问
47     }
48 };
49
50 // main
51 #include "Base.h"
52 #include "Derivel.h"
53 54 int _tmain(int argc, _TCHAR* argv[])
55 {
56     Derivel a(1,2,3);
57   a.printX();
58 // 正确,基类的公有成员,公有继承后作为派生类的公有成员,可以外部访问
59   a.printY();
60 // 错误,基类的保护成员,公有继承后作为派生类的保护成员,不能外部访问
61   a.printZ();
62 // 错误,基类的私有成员,公有继承后作为派生类的私有成员,不能外部访问
63    a.show();
64    return 0;
65 }

总结:

当类的继承方式为公有继承的时候,基类的public成员被继承后作为派生类的公有成员。在类的外部通过派生类的对象和派生类的内部都可以直接访问。基类的protected成员被继承后作为派生类的保护成员,在类的外部通过派生类的对象不能访问,只能在派生类的内部访问。基类的private成员被继承后作为派生类的私有成员,在派生类的内部是不能直接访问的,在派生类的外部同样也是不能访问的。

iii. 保护继承的访问规则


基类成员


Private成员


Public成员


Protected成员


内部访问


不可访问


可以访问


可以访问


对象访问


不可访问


不可访问


不可访问

首先,我们根据一个具体的例子来看一下。

 1 // 基类
 2 class Base
 3 {
 4 public:
 5     Base(int a, int b, int c): x(a),y(b),z(c)
 6     {}
 7     virtual ~Base(void);
 8
 9     int x;
10     void printX()
11     {
12        printZ();     // 间接的访问基类的private成员
13        printf("X = %d\n", x);
14     }
15
16 protected:
17     int y;
18     void printY()
19     {
20        printf("Y = %d\n", y);
21     }
22
23 private:
24     int z;
25     void printZ()
26     {
27        printf("Z = %d\n", z);
28     }
29 };
30
31 // 派生类
32 #include "base.h"
33
34 class Derivel :
35     protected Base
36 {
37 public:
38     Derivel(int a, int b, int c):Base(a,b,c)
39     {}
40     virtual ~Derivel(void);
41
42     void show()
43     {
44        printX();     // 正确,基类的公有成员,派生类内部访问可能
45        printY();     // 正确,基类的保护成员,派生类内部访问可能
46        printZ();     // 错误,基类的私有成员,派生类不能内部访问
47     }
48 };
49
50 // main
51 #include "Base.h"
52 #include "Derivel.h"
53
54 int _tmain(int argc, _TCHAR* argv[])
55 {
56     Derivel a(1,2,3);
57   a.printX();
58 // 错误,基类的公有成员,保护继承后作为派生类的保护成员,不能外部访问
59   a.printY();
60 // 错误,基类的保护成员,保护继承后作为派生类的保护成员,不能外部访问
61   a.printZ();
62 // 错误,基类的私有成员,保护继承后作为派生类的私有成员,不能外部访问
63   a.show();
64     return 0;
65 }

总结:

当类的继承方式为保护继承的时候,基类的public成员被继承后作为派生类的保护成员。在类的外部通过派生类的对象不能访问,在派生类的内部可以直接访问。基类的protected成员被继承后作为派生类的保护成员,在类的外部通过派生类的对象不能访问,只能在派生类的内部访问。基类的private成员被继承后作为派生类的私有成员,在派生类的内部是不能直接访问的,在派生类的外部同样也是不能访问的。

时间: 2024-10-19 19:06:46

C++ 面向对象的三个特点--继承与封装(一)的相关文章

Python全栈开发——面向对象的三大特性(继承 & 多态 &封装)

1.继承 1.两层意思改变和扩展(详细看随笔继承和组合) 2.多态(体现在运行时的状态) 1.不同的类可以调用相同的方法,得到不同的结果 2.实际上是继承的一种体现机制 class H2o: def __init__(self,name,temperature): self.name=name self.temperature=temperature def turn_ice(self): if self.temperature<0: print('温度太低,变成[%s]' %self.name

Python之面向对象(三)继承详解以及面向对象三大特性

6.4 面向对象之:继承 面向对象的继承简介:继承(英语:inheritance)是面向对象软件技术当中的一个概念.如果一个类别A"继承自"另一个类别B,就把这个A称为"B的子类别",而把B称为"A的父类别"也可以称"B是A的超类".继承可以使得子类别具有父类别的各种属性和方法,而不需要再次编写相同的代码.在令子类别继承父类别的同时,可以重新定义某些属性,并重写某些方法,即覆盖父类别的原有属性和方法,使其获得与父类别不同的功能

Python面向对象之:三大特性:继承,封装,多态。

前言: python面向对象的三大特性:继承,封装,多态. 1. 封装: 把很多数据封装到?个对象中. 把固定功能的代码封装到?个代码块, 函数, 对象, 打包成模块. 这都属于封装的思想. 具体的情况具体分析. 比如. 你写了?个很?B的函数. 那这个也可以被称为封装. 在?向对象思想中. 是把?些看似?关紧要的内容组合到?起统?进?存储和使?. 这就是封装. 2. 继承: ?类可以?动拥有?类中除了私有属性外的其他所有内容. 说?了, ??可以随便?爹的东?. 但是朋友们, ?定要认清楚?个

19.Python面向对象之:三大特性:继承,封装,多态。

前言: python面向对象的三大特性:继承,封装,多态. 1. 封装: 把很多数据封装到?个对象中. 把固定功能的代码封装到?个代码块, 函数, 对象, 打包成模块. 这都属于封装的思想. 具体的情况具体分析. 比如. 你写了?个很?B的函数. 那这个也可以被称为封装. 在?向对象思想中. 是把?些看似?关紧要 的内容组合到?起统?进?存储和使?. 这就是封装. 2. 继承: ?类可以?动拥有?类中除了私有属性外的其他所有内容. 说?了, ??可以随便?爹的东?. 但是朋友们, ?定要认 清楚

javascript面向对象系列第三篇——实现继承的3种形式

前面的话 学习如何创建对象是理解面向对象编程的第一步,第二步是理解继承.开宗明义,继承是指在原有对象的基础上,略作修改,得到一个新的对象.javascript主要包括类式继承.原型继承和拷贝继承这三种继承方式.本文是javascript面向对象系列第三篇——实现继承的3种形式 类式继承 大多数面向对象的编程语言都支持类和类继承的特性,而JS却不支持这些特性,只能通过其他方法定义并关联多个相似的对象,如new和instanceof.不过在后来的ES6中新增了一些元素,比如class关键字,但这并不

面向对象的三个特征:封装(抽象)、继承、多态

面向对象的三个特征:封装(抽象).继承.多态. 继承:一种代码重用的方式. 1.父类(基类,超类) 2.子类 1).子类在同一个包下面能够范文父类除了私有private修饰的所有属性和方法 2).在不同包下面,子类对象只能访问public修饰的属性和方法 3).在子类内部,如果不同包的情况下,可以访问protected修饰的属性和方法,但是不能访问默认的访问修饰符修饰的属性和方法 4).子类在初始化的时候会先调用父类的默认不带参数构造器,如果没有,就会报错,我们只有人为的修改: 1.将父类添加一

PHP面向对象详解:继承、封装与多态

首先,在解释面向对象之前先解释下什么是面向对象? [面向对象]1.什么是类? 具有相同属性(特征)和方法(行为)的一系列个体的集合,类是一个抽象的概念2.什么是对象?从类中拿到的具有具体属性值得个体,称为对象,对象是一个具体的个体 所以,面向对象即我们专注对象来处理问题,通过从一个个具有属性和功能的类中拿到对象来处理问题. 下面我们再来细说下面向对象的三大特征:继承/封装/多态 一.继承 在PHP中我们主要通关Extends关键字来实现继承   ->class Student extends P

面向对象的三个特征。

引用文章:http://blog.csdn.net/ma1kong/article/details/4457044 引用介绍:一篇偏向JAVA的文章.对此,我删除了一些文字,保持对C++适用. 面向对象的三个特性:封装,继承,多态. 特定的作用:封装可以隐藏实现细节,使得代码模块化:继承可以扩展已存在的代码模块(类):都属于代码重用.多态则是为了实现接口重用.多态是为了类在继承和派生的时候,保证使用“家谱”中任一类的实例的某一属性时的正确调用(个人理解:实际就是虚函数的作用). 一.封装 1:封

面向对象的三个特性:封装

面向对象的三个特性:封装.继承.多态 //1.封装目的:让类更加安全,不让外界直接访问类的成员 //具体做法[1]将成员设为私有:访问修饰符 class ren { [var $age;] private $age; } $r=new ren(); echo $r->age;//访问不到 [2]造成员方法来操作变量 class ren { private $age; //制造方法去给变量$age赋值 public function SetAge($a) { if($a>18 and $a<