1、面向对象
是相对于面向过程来说的,面向对象时将功能等通过对象来实现的,将功能封装到对象中,让对象去实现具体的细节。是对数据一种优化,操作起来更加的方便,简化了过程。
将现实世界中的实体转化为计算机世界中,我们将实体的属性和行为,转化为成员变量和成员方法.
属性——成员变量,行为——成员方法
2、封装
将对象的属性和实现细节隐藏,仅对外提供公共访问方式,将变化隔离,便于使用,提高复用性和安全性。具体实现使用访问限定符
3、继承
继承的本质是代码复用。派生类继承了基类除了构造和析构以外的所有成员
访问限定符public:任意位置 protected:本类和子类 private:本类
继承方式 | 访问限定 | public | protected | private |
---|---|---|---|---|
public | public | protected | 不可访问 | |
protected | protected | protected | 不可访问 | |
private | private | private | 不可访问 |
类与类的三种关系:是以成员变量的方式实现(私有继承是一种has_a的关系)
- 组合:a part of-------has_a
- 继承:a kind of------is_a
- 代理
同名函数的关系
- 重载:overload
- 隐藏:overhide 派生类中函数把基类中的所有同名函数隐藏(不同作用域--继承,同名,同参)
- 重写:override
4、多态
接口的多种不同的实现方式即为多态。为了实现接口复用。
多态分为静多态和动多态。静多态是编译时期的多态,主要使用模板和函数重载实现的。动多态是运行时的多态,利用虚函数和虚函数机制实现的。
1.虚函数
虚函数就是在类的普通成员函数之前加关键字virtual。c++中的虚函数主要用于实现“运行时多态”。父类中提供虚函数的实现,为子类提供默认的函数实现,而子类也可以重写父类的虚函数实现子类的特殊化(重写也称覆盖)。虚函数机制中有两个重要的东西虚函数表(vftable)和虚函数指针(vfptr)。
2.虚函数表
虚函数表是在编译阶段生成的,存放在.rodata段,每一个类都有一个vftable。vftable中放有三样东西,RTTI(运行时的类型),vfptr相对于类型的偏移量、虚函数的入口地址。
3.虚函数指针
一个虚函数指针(vfptr),它指向一个虚函数表vftable。生存周期从程序开始到程序结束,指向哪个类的对象,指针就指向哪个类的虚函数表。虚函数指针的优先级最高,在内存布局的最前面。
4.哪些函数可以是虚函数
可以是虚函数的两个前提是:函数可以取地址、依赖对象调用
- 普通函数 不可以,不依赖对象
- 类的普通函数 可以
- 构造函数 不可以,对象还未生成
- 析构函数 可以
- 静态成员函数 不可以,不依赖对象
- inline函数 不可以,不生成符号,没办法取地址