C++虛擬函數實現多態性分析

來源:互聯網
上載者:User

  物件導向程式設計的基本觀點是用程式來模擬大千世界,這使得它的各種根本特性非常人性化,如封裝、繼承、多態等等,而虛擬函數就是c++中實現多態性的主將。為了實現多態性,c++編譯器也革命性地提供了動態聯編(或叫晚捆綁)這一特徵。

  虛擬函數亦是mfc編程的關鍵所在,mfc編程主要有兩種方法:一是響應各種訊息,進行對應的訊息處理。二就是重載並改寫虛擬函數,來實現自己的某些要求或改變系統的某些預設處理。

  虛函數的地位是如此的重要,對它進行窮根究底,力求能知其然並知其所以然對我們編程能力的提高大有好處。下面且聽我道來。

  多態性和動態聯編的實現過程分析

  一、基礎

  1、多態性:使用基礎類的指標動態調用其衍生類別中函數的特性。

  2、動態聯編:在運行階段,才將函數的調用與對應的函數體進行串連的方式,又叫運行時聯編或晚捆綁。

  二、流程說明

  1、編譯器發現一個類中有虛函數,編譯器會立即為此類產生虛擬函數表 vtable(後面有對vtable的分析)。虛擬函數表的各表項為指向對應虛擬函數的指標。

  2、編譯器在此類中隱含插入一個指標vptr(對vc編譯器來說,它插在類的第一個位置上)。

  有一個辦法可以讓你感知這個隱含指標的存在,雖然你不能在類中直接看到它,但你可以比較一下含有虛擬函數時的類的尺寸和沒有虛擬函數時的類的尺寸,你能夠發現,這個指標確實存在。

  

      class cnovirtualfun

  {

  private:

  long lmember;

  public:

  long getmembervalue();

  }

  class chavevirtualfun

  {

  private:

  long lmember;

  public:

  virtual long getmembervalue();

  }

  cnovirtualfun obj;

  sizeof(obj) -> == 4;

  chavevirtualfun obj;

  sizeof(obj) -> == 8;

相關文章

聯繫我們

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