C++ 多態的原理

來源:互聯網
上載者:User

標籤:

1、多態解決什麼問題?
面向抽象編程,使用者不需要關心引用或者指標的真實類型,已經內部實現。
2、C++ 要具備多態的性質,滿足兩個條件:表面類型和真實類型不一樣,方法是虛方法。
3、多態是如何?的?
實現多態就是要解決下面的問題,把子類對象當做父類對象來解釋,還要保證調用的是子類的方法。
4、實現原理是:指標(引用)指向對象,對象的記憶體分布中有一個欄位 虛方法表指標,不管是父類對象還是子類對象,這個欄位(虛方法表指標)所在的記憶體位置是一樣的,把子類對象當成父類對象來解釋,訪問的都是這個欄位。虛方法表指標指向類的虛方法表,類的虛方法表可以認為是一個數組,包含一組虛方法。子類繼承父類,會把父類的虛方法表做一個copy,對於重寫的虛方法,替換為自己重寫後的方法,對於增加的虛方法添加在虛方法表的後面。
5、考慮Animal* pa = new Dog(); pa->Say(); 會翻譯成pa->pFunArray[0](),pFunArray是虛方法表指標,調用類的虛方法表中的第一個方法,由於子類已經替換了,也就是子類的方法了。
6、多態的這種實現存在什麼問題?
子類對父類的虛方法表,做一個副本,只替換重寫的虛方法,沒有重寫的虛方法存在兩個副本。考慮極端的情況,父類有1000個虛方法,子類只重寫了一個虛方法,999個方法都有兩個副本,導致記憶體的浪費,特別是當繼承層次深,類的種類多,記憶體開銷就更大,比如視圖架構MFC。
7、怎麼解決這個問題?
子類只儲存重寫的虛方法,對於沒有重寫的虛方法引用父類的虛方法,這就導致一個新問題,相同方法,對於父類和子類,虛方法的位置不一樣,這可以使用雜湊表解決。

C++ 多態的原理

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.