《C++反彙編與逆向分析技術揭祕》讀書總結——從記憶體角度看繼承

我是大黑發表於2018-10-06

子類具備父類的所有成員資料和成員函式。在父類中宣告為私有(private)的成員,雖然子類物件無法直接訪問,但是在子類物件的記憶體結構中,父類私有的成員資料依然存在。C++語法規定的訪問控制許可權僅限於編譯層面,由編譯器進行語法檢查。

 

子類物件在記憶體中的資料排列為:先安排父類的資料,後安排子類新定義的資料。記憶體結構等價於如下程式碼形式:

class CBase{...};             //父類定義程式碼略
class CDerive
{
    public:
        CBase m_Base;         //原來的父類CBase成為成員物件
        int m_nDerive;        //原來的子類派生資料
}

 

1、如果子類沒有建構函式或解構函式,而其父類卻需要建構函式與解構函式時,編譯器會為該父類的子類提供預設的建構函式與解構函式,從而呼叫成員物件(指等價程式碼中的CBase類物件)的建構函式。

2、如果子類含有建構函式,而父類不存在建構函式,則分兩種情況:如果父類中沒有虛擬函式,也不存在構造祖先類的問題,則編譯器不會為父類提供預設的建構函式,因為沒有意義;如果父類含有虛擬函式,此時父類需要初始化虛表工作,因此編譯器會為其提供預設的建構函式,以初始化虛標指標。

 

未完待續

本文是對原著的總結,非我原創,詳情求購買原著。

相關文章