【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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章