Can you summarize the following document?
        
  多重繼承可以導致某些令人混淆的情況,所以關於它的好處與風險之間孰輕孰重常常受人爭論。Java使用了一個折衷的辦法:英語:Java允許一個類別繼承自多於一個父介面(可以指定某一個類別,它繼承了所有父類別的型別,並必須擁有所有父類別介面的外部可見方法的具體實現,並允許編譯器強制以上要求),但只可以從一個父類別繼承實現(方法與資料)。微軟的.NET程式語言,例如C#和Visual Basic.NET也使用了這種介面的做法。  物件導向的程式設計中,繼承描述了兩種型別或兩個類的物件,其中一種是另外一種的「子型別」或「子類別」。子類別繼承了父類別的特徵,允許分享功能。例如,可以創造一個「哺乳類動物」類別,擁有進食、繁殖等的功能;然後定義一個子型別「貓」,它可以從父類別繼承上述功能,不需重新編寫程式,同時增加屬於自己的新功能,例如「追趕老鼠」。  然而,如果想同時自多於一個結構繼承,例如容許「貓」繼承「哺乳類動物」之餘,同時繼承「卡通角色」和「寵物」,缺乏多重繼承往往會導致十分笨拙的混合繼承,或迫使同一個功能在多於一個地方被重寫。(這帶來了維護上的問題)  多年以來,多重繼承都是一個敏感的話題,反對者指它增加了程式的複雜性與含糊性,例如在鑽石問題(或稱菱型缺陷)中。Loki函式庫針對多重繼承進行改良,以英語:TypeList(二叉樹結構)避免這個問題。  各種程式語言有不同的方式處理上述問題。例如Eiffel容許子型別透過重新命名,或提前為他們確定選擇規則,來適應(英語:adapt)它繼承得來的功能。英語:Java允許物件從多個介面繼承,但僅允許一個實現繼承。REALbasic與它相似,並增加了一個不需使用繼承來「擴充套件」一個類別的功能。Perl使用一種有序列表式的繼承機制:搜尋方法時,它會先搜尋當前類別的方法,然後使用深度優先搜尋來順序尋找各個繼承類別及其父類別。CLOS允許程式設計者完全控制方法的組合。如果這還不足夠,元物件協議給程式設計者一種手段去修改繼承,方法排程,類別特例化,及其它內部的機制,而不影響系統的穩定性。

  C++支援多重繼承,允許對現實世界進行更直接的建模,Borland C++的OWL Framework大量使用多重繼承來描述視窗的關係。微軟的MFC僅使用單一繼承描述視窗,ATL使用多重繼承實現COM/ActiveX,WTL則使用多重繼承實現視窗。

  對於最左基類,虛擬函式的覆蓋與單繼承情形一致。  對於非最左的基類,虛擬函式仍然可能會被派生類的成員函式覆蓋。

  一個類的非靜態成員函式,一般需要使用類物件的英語:this指標來訪問類資料成員。程式載入到記憶體後,成員函式程式碼佔據了一塊記憶體空間。成員函式並不知道自身是作為一個單獨的(或最派生)類的直接成員函式,還是作為一個被派生的基類的成員函式而存在。實際上在記憶體空間的非靜態成員函式,可能會同時是單獨的(或最派生)類的直接成員函式與被派生的基類的成員函式。非靜態成員函式也僅知道宣告瞭該函式的類的資料成員的空間分佈,不可能知道以該類為基類的派生類的資料成員的空間分佈。因此呼叫非靜態成員函式時,呼叫者有責任傳給成員函式正確的英語:this指標,即令英語:this指標指向宣告瞭該成員函式的類的物件開始地址。  對於單繼承,派生類與基類的物件開始地址是一樣的,因此呼叫非靜態成員函式不需要調整英語:this指標。對於多繼承,呼叫不是最左基類的非靜態成員函式時,呼叫者必須先調整英語:this指標。這又分為兩種情形:  一是非虛擬函式,在函式呼叫現場直接調整英語:this的值。這是編譯器根據多重繼承的派生類的例項物件或指標在編譯時就能確定的。例如: 二是虛擬函式情形。因為虛擬函式的開始地址必須存放在虛表條目中,所以多重繼承的派生類對非最左基類的被覆蓋(英語:override)的虛擬函式,在該派生類的相應的虛表條目中填寫的是一個樁(英語:thunk)地址。該樁通常只有兩條機器指令,首先是調整英語:this值(即修改英語:ecx暫存器),然後是呼叫指令(英語:call)。
物件導向程式設計中的多重繼承(英語:multiple inheritance,縮寫:英語:MI)指的是一個類別可以同時從多於一個父類繼承行為與特徵的功能。與單一繼承相對,單一繼承指一個類別只可以繼承自一個父類。