回覆列表
  • 1 # Gfilsxin

    首先要明確什麼是多型:

    多型就是一個名字或符號具有多種含義,透過過載來實現。有函式過載和運算子過載兩種。

    編譯是靜態的,函式過載是靜態多型性的具體示例,程式碼在編譯完就已經決定出同一個介面用哪種實現,這就是編譯期多型。

    執行時多型的,虛擬函式是動態多型性的具體示例。直到程式執行時,拿到CPU暫存器裡的指標了,才知道這個指標究竟指向父類還是繼承類的虛擬函式實現,這就是執行期的多型了。

    也就是說,普通的成員函式,在編譯時呼叫關係就已經確定了,而虛擬函式,需要在執行時,才能根據物件指標指向的是父類還是繼承類,來決定呼叫哪一個實現,我們看看下面的類定義:

        class father

       {

             virtual testVfunc(){

                   std::cout<<"father testVfunc run"<<std::endl;

             }

       }

      

       class child : public father

       {

              virtual testVfunc(){

                   std::cout<<"child testVfunc run"<<std::endl;

               

       }

    定義兩個物件:father pFather=new father();

    child pChild=new child();這兩個物件在記憶體中

    有一個vptl指標,分別指向自己實現的函式,這樣程式在執行到虛擬函式時,就會查詢這個指標具體指向的地址空間,執行自己的實現函式。

    注,泛型是一種特殊形式的靜態多型,實現方式是型別引數化。使用模板機制的程式設計就是泛型程式設計。

  • 2 # 三袋大菠蘿

    編譯成彙編之後是一個虛擬函式表,函式都是用地址表示的,類似C語言的函式指標。

    把函式做成成員變數就是類似的多型過載。

    而模板類更像是宏,不同型別的輸入輸出,相同的處理邏輯,編譯之後會變成很多類。

  • 中秋節和大豐收的關聯?
  • 飯後胃脹怎麼辦?