前言
c++分为三大特性:封装、继承、多态
封装目的是实现代码模块化。
继承目的是实现代码扩展。
多态目的是分为静态多态和动态多态。静态多态:函数重载和泛型编程。动态多态:虚函数重写。
一、封装
封装就是将数据和行为有机结合起来,形成一个整体。把数据和处理数据的操作结合形成类,数据和函数都是类的成员。
封装的类有如下的访问类型:
1)公有( public )成员可以在类外访问;
2)私有( private )成员只能被该类的成员函数访问;
3)保护( protected )成员只能被该类的成员函数或派生类的成员函数访问。
二、继承
Is a -à继承关系 A is a B
这个已有的类称为基类,新建的类称为子类。例如,定义手机是基类,那么派生类可以是华为或者是苹果,等等。
类继承父类的所有(数据成员、成员函数)
继承的格式是什么?
Class 子类名:继承方式 父类名{};
继承方式:
Public继承: 父类中public成员继承到子类中,在类外、类内都可以访问
父类中protected成员在子类类内是可以访问
Private继承:
父类中public成员继承到子类中,在类外不可以访问,类内部是可以访问
父类中private成员在子类类内是不可以访问的
父类中protected成员在子类类内是可以访问
Protected继承:
父类中public成员继承到子类中,在类外不可以访问,类内部是可以访问
父类中private成员在子类类内是不可以访问的
父类中protected成员在子类类内是可以访问
2、子类的构造函数
3、子类的析构函数:
先构造的后析构
4、多层继承
三、多态
动态多态,是基于封装和继承的来实现的,多个子类对继承于一个父类的虚函数进行重写,来实现不同状态
实现动态多态的条件:
- 必须有继承
- 父类中有虚函数,子类有重写这个虚函数(子类中的函数和父类中的这个函数的首部必须是一模一样的,只有函数体内部是不同的)
- 通过父类的指针或者是引用去调用这个虚函数的时候
多态实现的原理
一个类中如果有虚函数,那这个类就有一张虚函数表,这个表中存的就是这个类所有虚函数的地址(函数指针数组)。
多态存在的问题
用父类的指针去释放子类的对象,析构只执行了父类的,没有走子类的析构(析构函数的作用),会存在内存泄漏问题。
父类的析构函数变成虚析构函数,就可以实现delete 父类指针也会执行子类析构的效果
重定义、重写、重载的区别
重载:同一个作用域(构造函数重载)
重定义(隐藏): 在继承关系中,子类定义了和父类同名的函数(只有函数名相同—不包括虚函数)
重写:在继承关系中,子类重写了父类的虚函数(函数的首部是一模一样的)