本篇主要讲面向对象的封装和继承特性,另一个特性多态会在后面的文章中讲到。
目录:
面向对象编程过程
封装的实现
继承的方式
继承后对象的构造顺序
继承的种类
一、什么是面向对象编程(Object Oriented programming,OOP)思想?
在学习C++之前我们一直说面向过程,也就是对于一个需要解决的问题,进行分析,得出每个步骤的实现和实现顺序的过程。所以自然而然的就能够进行面向过程编程,既只需用函数实现这些步骤,然后在使用的时候一个一个进行调用即可。但是为了实现代码的可移植性和可扩展性,就有了面向对象。就是把构成问题的事物分解成各个对象,然后描述某一类对象在解决整个问题步骤中的行为。用一幅图来描述面向对象编程的过程。
有了面向对象编程技术,因此(程序=算法+数据结构)变为了(程序=基于对象的算法+以对象为最小单位的数据结构)
二、封装:隐藏内部实现。
封装如何实现?在C++里边,封装和隐藏是通过访问限定符来实现。
三种访问限定符:
public:任意位置都能访问成员变量。
protected:只在类中可以访问,包括继承和派生中派生类可以访问父类的保护成员。
private:只有在自己的类中可以访问,但是友元关系可以打破。
说到这块了,顺便也说一下struct和class的区别
1、对于class来说定义的变量和函数默认是private,对于struct来说默认是public
2、在struct类中定义该类成员要写全称。//struct B{struct B *p;};
3、空结构体:
在windows上:C语言不允许定义空结构体、C++定义空结构体大小为1个字节。
在Linux上:C语言定义空结构体大小为0个字节、C++定义空结构体大小为1个字节。
class定义空结构体为1个字节。
三、继承:实代码复用。
(1)、继承的方式
有三种访问限定自然也就有三种继承关系咯!分别叫做共有继承、保护继承、私有继承。如果不给出继承关系默认是私有继承。
写法如下:
class Base
{
……
};
class derive : Base
{
……
};
在C++中冒号用到两个地方,分别是继承和初始化列表中。
不同的继承方式又对成员变量的访问有什么影响呢?用一张表总结一下:
基类中变量的访问限定 | 派生类中继承过来的访问限定 | 外部对派生类中成员变量的访问 | |
---|---|---|---|
共有继承 | public | public | 能 |
protected | protected | 不能 | |
private | 不可见 | 不能 | |
保护继承 | public | protected | 不能 |
protected | protected | 不能 | |
private | 不可见 | 不能 | |
私有继承 | public | private | 不能 |
protected | private | 不能 | |
private | 不可见 | 不能 |
(2)、继承后对象的构造顺序
1、基类构造函数:如果有多个基类,构造函数的调用顺序是某类在类派生表中出现的顺序,而不是他们在成员初始化列表中出现的顺序。
2、成员类对象的构造函数:如果有多个成员类对象,则构造顺序是对象在类中被申明的顺序,而不是他们出现在成员初始化列表中的顺序。
3、派生类构造函数。
(3)、继承的种类
1、单一继承
2、多重继承
3、重复继承
对于这几种继承其中对成员变量的访问还是结合上面的表格分析即可。