C++複位義成員的訪問

來源:互聯網
上載者:User

      C++的繼承特性在一般的小型程式中很不常用,但是對於比較大型的項目,是屢見不鮮。多數初學,或者不常使用C++繼承特性的人都會認為衍生類別中的成員不可以和基類中的成員重名(虛函數除外),其實不然,這種情況不僅是允許的,而且還比較常見。
     

假設有兩個類,一個List類,一個String類,List類中有insert()函數和x變數,且insert()函數不是虛函數,String繼承
於List,並也有insert()函數和x變數,這時我們通過String對象調用insert()函數或者訪問x變數會直接調用
String::insert()或者訪問String::x。那我們該如何訪問基類中的成員呢?大部分C++入門書籍中都沒有關於這個問題的解釋,要想
解釋這個問題,我們要先來看一下C++類對象的記憶體結構。

圖片來自網路,註:__vfptr為虛函數指標

從該圖便可看出衍生類別的記憶體結構,在衍生類別的成員前面,會有一塊記憶體存放基類中的成員,我們需要調用的List::insert()和List::x便儲存在這裡。

String類結構:

List::insert

List::x

String::insert

String::x

 

如此一來,想要訪問基類中的重名成員就簡單多了。由於基類中的成員是在對象的頭部,我們便可以使用強制類型轉換的方法,按照基類的格式訪問成員(對此,看過PEViewer原始碼的同學一定不陌生,PEViewer就是對存放檔案內容的記憶體進行轉換後讀取屬性的)。

具體代碼:

String str;

((List*)(&str))->insert();                       //訪問List::insert()

(*(List*)(&str)).insert();

((List*)(&str))->x;                               //訪問List::x

(*(List*)(&str).x;

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.