虛擬繼承是一種繼承類型,其中父類的實現是不完整的,并且需要子類才能完整地定義對象。這種類型的繼承可以與單繼承和多重繼承結合使用,但最常用于多重繼承。任何從虛擬基類成為該基類的直接子類。虛擬基類可能依賴于子類...
虛擬繼承是一種繼承類型,其中父類的實現是不完整的,并且需要子類才能完整地定義對象。這種類型的繼承可以與單繼承和多重繼承結合使用,但最常用于多重繼承。任何從虛擬基類成為該基類的直接子類。虛擬基類可能依賴于子類來實現其所有方法,但這不是一個要求。C是最常用的使用虛擬繼承的計算機語言。C是最常用的使用虛擬繼承的計算機語言。要在C中聲明虛擬繼承,使用“virtual”關鍵字。父類和子類都必須用“virtual”關鍵字聲明虛方法這告訴C編譯器超類是不完整的,它必須從子類中獲取信息才能完成它。使用子類來完成超類并不意味著子類如果有相同的基類,它們會相互覆蓋,而是由C編譯器來決定每個對象的哪些部分虛擬繼承需要虛擬基類,C中的全局函數不能聲明為虛。只有在遵循面向對象編程(OOP)原則的情況下才能使用此繼承類型。原因是全局函數與特定的類沒有關聯,所以通常是獨立的,沒有超類和子類的繼承是不可能發生的,所以全局函數和虛繼承是互斥的,全局函數理論上可以在虛函數內部使用,但反過來可能并不總是有效的,虛擬繼承被用來解決許多編程問題,其中最有用的是解決歧義在多重繼承中,可以有一個基類a,它有兩個子類B和C,然后是一個從類B和C繼承的類D。這種模式通常被稱為“死亡鉆石”,因為如果類a、B和C都有相同方法的實現,類D不可能確定它應該使用哪個實現。虛擬繼承解決了這個問題,因為每個類的實現都是不同的,因此沒有歧義。這種區別是由名為虛擬表(vtables)的專用內部對象處理的,這些對象跟蹤每種對象類型,但這些表不需要由程序員顯式地操作,因為它們是內置于語言中的
-
發表于 2020-08-06 15:03
- 閱讀 ( 635 )
- 分類:電腦網絡