1. 封装
- 封装:隐藏对象的属性和实现细节,仅对外公开接口和对象进行交互。
- 封装性实际上是由编译器去识别关键字public、private和protected,体现在类的成员可以有公有成员(public),私有成员(private),保护成员(protected)。
- 私有成员是在封装体内被隐藏的部分,只有类的成员函数才可以访问私有成员,而在类体外的函数时不能访问的;公有成员是封装体与外界的一个接口,类体外的函数可以访问公有成员;保护成员是只有该类的成员函数和该类的派生类才可以访问的。
- 封装的作用是:降低耦合。
2. 继承
- 继承是面向对象程序设计使代码可以复用的最重要的手段,它允许程序员在保持原有类特性的基础上进行扩展,增加功能,这样产生新的类,称派生类;
2.1 格式
//Person为父类、基类,Student为派生类、子类,public为继承方式
class Student : public Person
{
}
2.2 继承方式
【基类成员在不同继承方式下的访问】
2.3 继承中的作用域
- 在继承体系中基类和派生类都有独立的作用域;
- 子类和父类中有同名成员,子类成员将屏蔽父类对同名成员的直接访问,这种情况叫隐藏,也叫重定义;
- 实际中在继承体系里面最好不要定义同名的成员。
2.4 菱形继承
2.4.1 什么是菱形继承
- 菱形继承是多继承的一种特殊情况;
- 菱形继承会有数据冗余和二义性;
2.4.2 菱形虚拟继承
- 虚拟继承可解决菱形继承的二义性和数据冗余的问题。
- 为什么虚拟继承可以解决这两个问题:由于虚拟继承中存在虚基表。
3. 多态
- 多态是在不同继承关系的类对象,去调用同一函数,产生了不同的行为;
【在继承中构成多态的两个条件】
- 必须通过基类的指针或者引用调用虚函数;
- 被调用的函数必须是虚函数,且派生类必须对基类的虚函数进行重写。
【重载、重写、重定义区别】
3.1 抽象类
- 包含纯虚函数的类,抽象类也成为接口类;
- 纯虚函数:在虚函数的后面写上 = 0 ,则这个函数为纯虚函数;
- 作用:要求派生类对虚函数进行重写。
3.2 虚函数和虚函数表
- 虚函数:即被virtual修饰的类成员函数称为虚函数;
- 虚函数表本质是一个存虚函数指针的指针数组;
- 虚函数和虚函数表均在代码段。