【C++】封装、继承与多态

封装

这个很好理解,将成员变量和成员方法,将一些方法的实现屏蔽起来,以达到对用户的透明!

继承

多态

多态就是同一接口,多种形态

  • 多态的发生时机:指针调用虚函数,并有对象生成
  • 什么是虚函数?
    虚函数就是在普通函数前面加上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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章