封裝
這個很好理解,將成員變量和成員方法,將一些方法的實現屏蔽起來,以達到對用戶的透明!
繼承
多態
多態就是同一接口,多種形態
- 多態的發生時機:指針調用虛函數,並有對象生成
- 什麼是虛函數?
虛函數就是在普通函數前面加上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