[Z]C++虛函數

來源:互聯網
上載者:User

虛函數的定義:

  虛函數必須是類的非靜態成員函數(且非建構函式),其存取權限是public(可以定義為private or proteceted, 但是對於多態來說,沒有意義。),在基類的類定義中定義虛函數的一般形式:

  virtual 函數傳回值類型 虛函數名(形參表)

  { 函數體 }

  虛函數的作用是實現動態聯編,也就是在程式的運行階段動態地選擇合適的成員函數,在定義了虛函數後,

  可以在基類的衍生類別中對虛函數重新定義(形式也是:virtual 函數傳回值類型 虛函數名(形參表){ 函數體 }),在衍生類別中重新定義的函數應與虛函數具有相同的形參個數和形參類型。以實現統一的介面,不同定義過程。如果在衍生類別中沒有對虛函數重新定義,則它繼承其基類的虛函數。當程式發現虛函數名前的關鍵字virtual後,會自動將其作為動態聯編處理,即在程式運行時動態地選擇合適的成員函數。

  實現動態聯編需要三個條件:

  1、 必須把需要動態聯編的行為定義為類的公用屬性的虛函數。

  2、 類之間存在子類型關係,一般表現為一個類從另一個類公有派生而來。

  3、 必須先使用基類指標指向子類型的對象,然後直接或者間接使用基類指標調用虛函數。

  定義虛函數的限制:

  (1)非類的成員函數不能定義為虛函數,類的成員函數中靜態成員函數和建構函式也不能定義為虛函數,但可以將解構函式定義為虛函數。實際上,優秀的程式員常常把基類的解構函式定義為虛函數。因為,將基類的解構函式定義為虛函數後,當利用delete刪除一個指向衍生類別定義的對象指標時,系統會調用相應的類的解構函式。而不將解構函式定義為虛函數時,只調用基類的解構函式。

  (2)只需要在聲明函數的類體中使用關鍵字“virtual”將函式宣告為虛函數,而定義函數時不需要使用關鍵字“virtual”。

  (3)如果聲明了某個成員函數為虛函數,則在該類中不能出現和這個成員函數同名並且傳回值、參數個數、參數類型都相同的非虛函數。在以該類為基類的衍生類別中,也不能出現這種非虛的同名同傳回值同參數個數同參數類型函數。

  為什麼虛函數必須是類的成員函數:

  虛函數誕生的目的就是為了實現多態,在類外定義虛函數毫無實際用處。

  為什麼類的靜態成員函數不能為虛函數:

  如果定義為虛函數,那麼它就是動態綁定的,也就是在衍生類別中可以被覆蓋的,這與靜態成員函數的定義(:在記憶體中只有一份拷貝;通過類名或對象引用訪問靜態成員)本身就是相矛盾的。

  為什麼建構函式不能為虛函數:

  因為如果建構函式為虛函數的話,它將在執行期間被構造,而執行期則需要對象已經建立,建構函式所完成的工作就是為了建立合適的對象,因此在沒有構建好的對象上不可能執行多態(虛函數的目的就在於實現多態性)的工作。在繼承體系中,構造的順序就是從基類到衍生類別,其目的就在於確保對象能夠成功地構建。建構函式同時承擔著虛函數表的建立,如果它本身都是虛函數的話,如何確保vtbl的構建成功呢?

  注意:當基類的建構函式內部有虛函數時,會出現什麼情況呢?結果是在建構函式中,虛函數機制不起作用了,調用虛函數如同調用一般的成員函數一樣。當基類的解構函式內部有虛函數時,又如何工作呢?與建構函式相同,只有“局部”的版本被調用。但是,行為相同,原因是不一樣的。建構函式只能調用“局部”版本,是因為調用時還沒有衍生類別版本的資訊。解構函式則是因為衍生類別版本的資訊已經不可靠了。我們知道,解構函式的調用順序與建構函式相反,是從衍生類別的解構函式到基類的解構函式。當某個類的解構函式被調用時,其衍生類別的解構函式已經被調用了,相應的資料也已被丟失,如果再調用虛函數的衍生類別的版本,就相當於對一些不可靠的資料進行操作,這是非常危險的。因此,在解構函式中,虛函數機制也是不起作用的。

相關文章

聯繫我們

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