簡體   English   中英

多繼承是編譯器編寫者的問題嗎? - c ++

[英]is multiple inheritance a compiler writers problem? - c++

我一直在閱讀有關多重繼承的內容

多重繼承的確切問題是什么? http://en.wikipedia.org/wiki/Diamond_problem

http://en.wikipedia.org/wiki/Virtual_inheritance
http://en.wikipedia.org/wiki/Multiple_inheritance

但是,由於代碼在解決歧義之前不能編譯,這不會使多重繼承成為編譯器編寫者的問題嗎? - 如果我不想編寫編譯器,這個問題如何影響我

如果你想編寫編譯的代碼,你必須知道哪些問題可能導致它不能編譯以及如何避免這些情況。 作為編譯器的用戶,您可以以可編譯的方式設計繼承層次結構。

此外,如果您不理解多繼承如何工作,您可能會錯誤地假設您的類究竟是做什么的。 如果類的行為與預期不同,則在嘗試使用它們時會導致錯誤。

如果由於多重繼承而導致未解決的歧義,編譯器編寫器將打印一個討厭的錯誤消息並停止編譯代碼。 當他們說代碼在解決歧義之前不會編譯時,有幾個問題需要考慮:

  1. 在解決歧義之前,您沒有工作程序。
  2. 編譯器無法為您解決此問題。
  3. 因此,在您解決之前,這是您的問題,而不是編譯器編寫者。

不,它對編譯器編寫器來說不是問題:

  • 通常,編譯器編寫器可能正在定義多繼承的工作方式。
  • 特別是對於C ++,有幾種解決方案供編寫者實現。

對於C ++程序員來說這是一個問題,但前提是你不了解MI在C ++中是如何工作的。

我有一個通用的解決方案,它有一個定義公共接口的基類 - 你可以認為它有不同的子部分,然后你可以將它們實現為不同的抽象類,它們由一個具體的葉子類多次繼承:

         ------
        | Base |
         ------
        |      |
         ------
           ^
           |
     -----------------
    |        |        |
 ------   ------   ------ 
|  A   | |  B   | |  C   |
 ------   ------   ------ 
|      | |      | |      |
 ------   ------   ------ 
    ^        ^        ^
    |        |        |
     -----------------
            |
          -------
         |Derived|
          -------
         |       |
          -------

A,B和C中的每一個都實現Base的非重疊子部分,這意味着您可以替換A,代替A'用於替代或改進的實現而不影響任何其他類。

一般來說,是的,你在頭上釘了一針。 它顯着增加了維護編譯器所涉及的復雜性和工作量,但對於程序員來說,它只增加了少量額外的復雜性,主要與如果鑽石問題出現時必須冗長具體相關。 (在精心設計的對象層次結構中,這應該是非常罕見的。)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM