虛擬類是一個只在內存中分配一次的類,這樣該類的子類只使用在內存中建立的父類的一個副本。類是一組共享公共特性或屬性的對象。使類虛擬化使面向對象的編程語言能夠使用多個繼承當第二代或更多代父類從公共祖先基類派...
虛擬類是一個只在內存中分配一次的類,這樣該類的子類只使用在內存中建立的父類的一個副本。類是一組共享公共特性或屬性的對象。使類虛擬化使面向對象的編程語言能夠使用多個繼承當第二代或更多代父類從公共祖先基類派生時。根據引用的計算機編程語言,“虛”關鍵字、類似關鍵字,或者,一個類的語法和語義被用來暗示一個特定的類被認為是虛擬的。使一個類成為虛擬的可以使面向對象的編程語言在第二代或更多代父類來自共同的祖先基類時使用多重繼承。不是所有面向對象的編程語言允許多重繼承,即子類可以同時從多個父類派生,一個類可以同時從兩個父類繼承所有的成員數據和成員函數,并且可以訪問這兩組父數據和函數,其他支持多重繼承的語言包括Perl、Python、Tcl,當用于創建子類的兩個或多個父類最初只從一個或同一個祖父母類派生時,多重繼承層次結構中會出現一個問題。這稱為diamond問題,源于這種情況下層次結構的外觀的名稱。當編譯器程序試圖實例化一個類,例如由兩個具有公共祖父母的父類構成的孫類,則在內存中生成兩個祖父母的副本,每個父類一個由于內存中同一祖父母的多個副本造成的歧義,編譯器無法確定孫輩應該使用哪個祖父母副本來訪問祖父母數據或函數。要糾正這種情況,在C語言中,當聲明父類時,祖父母會變成一個虛擬類。這會導致編譯器在內存中只生成一個祖父母共享的副本。一旦祖父母成為一個虛擬類,編譯器就可以決定孫子應該如何訪問祖父母,因為只有一個副本在構建類層次結構時,尤其是當它們將被包含在將來更大層次結構中或成為更大層次結構的基礎時,應格外小心。正確使用虛擬類可以給類層次結構更大的發展自由度;但是,研究堅實的計算機程序設計工程原理將有助于確保不發生因程序組織不當而產生的意外副作用
-
發表于 2020-08-06 09:13
- 閱讀 ( 2286 )
- 分類:電腦網絡