首頁  >  文章  >  後端開發  >  構造函數不能為虛函數

構造函數不能為虛函數

巴扎黑
巴扎黑原創
2016-12-20 16:48:592386瀏覽

構造函數不能宣告為虛函數的原因:

    1,所謂虛函數就是多態情況下只執行一個,而從繼承的概念來講,總是先構造父類對象,然後才能使子類對象,如果建構函式設為虛函數,那麼你在建構父類別的建構函式時就必須顯式的呼叫構造,還有一個原因就是為了防錯誤的發生,試想如果你在子類別中一不小心重寫了個跟父類別建構函數一樣的函數,那麼你的父類別建構子將會被覆蓋,也也就是不能完成父類別的構造,就會出錯。

class A
{
      public :
      virtual A()
     }
             
};
class B: public A
{
       
             cout          cout          cout       }

      派生類別繼承從而產生多態,衍生類別的建構函式中,編譯器會加入建構基底類別的程式碼,如果基底類別的建構函式用到了參數,則衍生類別在其建構函式中必須為基底類別給出參數,就是這個原因,原因有點繞,就是說如果派生類別的建構子必須跟父類別一摸一樣,這顯然是不符合實際的

當然還有其他的解釋:1,從儲存空間角度,虛函數對應一個vtable,可是這個vtable其實是儲存在物件的記憶體空間的。問題出來了,如果建構函數是虛的就需要透過vtable來調用,可是物件還沒有實例化,也就是記憶體空間還,沒有,無法找到vtable,所以建構子不能為虛函數。

2,從使用角度 虛函數主要用於在資訊不全的情況下,能使重載的函數得到對應的呼叫。建構函式本身就是要初始化實例,那使用虛函式也就沒有實例意義了,最開始的實例都沒有初始化,何來多態呢。虛擬函數的作用於透過父類別的指標或引用來呼叫它的時候能夠變成呼叫子類別的那個成員函數。而建構函數實在創建物件的時候自動調用的,不可能透過父類別的指標或引用去調用,因此規定建構函式不能為虛函數。

3,從實作上看,vtable在建構函數呼叫後才建立,因而建構函數不可能為虛函數,從實際意義上看,在呼叫建構子時還不能確定物件的真實型別(子類別要調用父類別的建構子),而且建構函式提供初始化,物件生命期只執行一次,不是物件的動態行為,也沒有太大必要成為虛函數。

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn