封装
这个很好理解,将成员变量和成员方法,将一些方法的实现屏蔽起来,以达到对用户的透明!
继承
多态
多态就是同一接口,多种形态
- 多态的发生时机:指针调用虚函数,并有对象生成
- 什么是虚函数?
虚函数就是在普通函数前面加上virtual关键字,同时伴随着对象的生成。- 虚函数的发生条件?
可以取地址,并且依赖对象调用(遵循thiscall调用约定)- 虚函数表的写入时机?
派生类对象的构造函数第一行代码调用之前。- 虚函数的内存布局?
- 纯虚函数
纯虚函数是特殊的虚函数,基类中不实现虚函数,派生类自己实现该函数,这种特殊的函数称为纯虚函数。有纯虚函数的类称为抽象类,抽象类不能实例化对象,但是可以定义抽象类的指针或引用,派生类必须重写方法后才能实例化对象。
静多态与动多态?
- 静多态在编译阶段确定函数调用,对象给出虚函数指针,然后虚函数指针指向虚函数表(存放在.rodata段)。
汇编指令是 call Base::func()- 动多态发生在运行阶段,在运行过程中,确定了eax寄存器里的值,才能确定调用哪个函数。
汇编指令如下:
mov ecx,dword ptr[p] 访问虚表指针,将虚表指针放在ecx寄存器中
mov eax,dword ptr[ecx] //将ecx(虚表指针)的值(虚函数表)放在eax寄存器中
call eax //调用函数,[虚函数表存放了虚函数的入口地址]- 动多态的发生时机?
指针调用虚函数,对象要完整
虚析构
基类指针指向派生类对象的时候,基类的析构函数要写成虚析构,否则释放基类指针的时候无法析构派生类对象。
C++支持的4种类型强转
- const_cast :去掉对象的const属性
- static_cast : 编译器认为可以支持的强转,安全性略高
- reinterpret_cast :类似C的强转
- dynamic_cast : RTTI强制转换 run-time type information