C 之虛函式

2021-06-28 11:08:17 字數 2231 閱讀 8829

若乙個例項方法宣告前帶有virtual關鍵字,那麼這個方法就是虛方法。

虛方法與非虛方法的最大不同是,虛方法的實現可以由派生類所取代,這種取代是通過方法的重寫實現的(以後再講)

虛方法的特點:

虛方法前不允許有static,abstract,或override修飾符

虛方法不能是私有的,因此不能使用private修飾符

虛方法的執行:

我們知道一般函式在編譯時就靜態地編譯到了執行檔案中,其相對位址在程式執行期間是不發生變化的,

而虛函式在編譯期間是不被靜態編譯的,它的相對位址是

不確定的,它會根據執行時期物件例項來動態判斷要呼叫的函式,

其中那個申明時定義的類叫申明類,那個執行時例項化的類叫例項類。

如:a a =new b(); 其中a是申明類,b是例項類。

1.當呼叫乙個物件的函式時,系統會直接去檢查這個物件申明定義的類,即申明類,看所呼叫的函式是否為虛函式;

2.如果不是虛函式,那麼它就直接執行該函式。而如果是乙個虛函式,那麼這個時候它就不會立刻執行該函式了,而是開始檢查物件的例項類。

3.在這個例項類裡,他會檢查這個例項類的定義中是否有實現該虛函式或者重新實現該虛函式(通過override關鍵字)的方法,

如果有,它就不會再找了,而是馬上執行該例項類中實現的虛函式的方法。而如果沒有的話,系統就會不停地往上找例項類的父類,

並對父類重複剛才在例項類裡的檢查,直到找到第乙個過載了該虛函式的父類為止,然後執行該父類裡過載後的函式。

例1:

classa}

class

program

}

執行a.sum:

1.先檢查申明類a 2.檢查到是sum是虛擬方法 3.轉去檢查例項類a,結果是題本身 

4.執行例項類a中實現sum的方法 5.輸出結果 i am a class,i am virtual sum(). 

例2:

classa}

class

b : a }

class

program

}

執行a.sum:

1.先檢查申明類a 2.檢查到是虛擬方法 3.轉去檢查例項類b,有重寫的方法 4.執行例項類b中的方法 5.輸出結果 i am b class,i am override sum().

例3:

classa}

class

b : a }

class

c : b

class

program

}

執行a.sum:

1.先檢查申明類a 2.檢查到是虛擬方法 3.轉去檢查例項類c,無重寫的方法 4.轉去檢查類c的父類b,有重寫的方法

5.執行父類b中的sum方法 6.輸出結果 i am b class,i am override sum().  

例4:

classa}

class

b : a }

class

program

}

執行a.sum:

1.先檢查申明類a 2.檢查到是虛擬方法 3.轉去檢查例項類b,無重寫的(這個地方要注意了,雖然b裡有實現sum(),但沒有使用override關鍵字,所以不會被認為是重寫) 4.轉去檢查類b的父類a,就為本身 5.執行父類a中的sum方法 6.輸出結果 i am a class,i am virtual sum(). 

那麼如果在例4裡,申明的是類b呢?

classa}

class

b : a }

class

program

}

執行b類裡的sum(),輸出結果i am b class,i am new sum().

可以使用抽象函式重寫基類中的虛函式嗎?

答案是可以的。

classa  

}abstract

class

b : a

abstract class c : a

密封類可以有虛函式嗎?

可以,基類中的虛函式將隱式的轉化為非虛函式,但密封類本身不能再增加新的虛函式

classa}

sealed

class

program:a

static

void

main(

string

args)

}

C 之虛函式

引入原因 為了方便使用多型特性,我們常常需要在基類中定義虛函式。class cman void move private class cchild public cman private cman m man cchild m child cman p 虛函式的使用精髓,如果不定義基類的指標去使用,...

c 之虛函式

靜態聯編也叫做早繫結,函式名與其在記憶體中的可執行 之間的對應關係在編譯時就已經確定了 動態聯編也叫做晚繫結,是之成員函式的呼叫語句在編譯時不知道要執行哪個記憶體位址的 成員函式的呼叫會根據目標物件的動態型別在程式執行時將函式名繫結到具體的函式上 靜態聯編舉例 class shape 執行上面的 後...

C 之虛函式

虛函式的實質和用途 如果不定義虛函式,基類和擴充套件類中不能有同名函式 名字,引數個數順序型別都相同 否則會發生同名覆蓋,此時想用基類指標去呼叫擴充套件類的物件是行不通的 但如果將基類的成員函式定時成虛函式,相當於允許擴充套件類中重新定義該同名函式執行不同的功能,此時就可以用基類的指標去指向擴充套件...