首頁>Club>
4
回覆列表
  • 1 # 使用者2311363102366

    即編譯器無法確定你在d。f()中要呼叫的函式f到底是哪一個。這裡可能會讓人覺得有些奇怪,命名只定義了一個CA::f,既然大家都派生自CA,那自然就是呼叫的CA::f,為什麼還無法確定呢?

    這是因為編譯器在進行編譯的時候,需要確定子類的函式定義,如CA::f是確定的,那麼在編譯CB、CC時還需要在編譯器的語法樹中生成CB::f,CC::f等標識,那麼,在編譯CD的時候,由於CB、CC都有一個函式f,此時,編譯器將試圖生成這兩個CD::f標識,顯然這時就要報錯了。

    (當我們不使用CD::f的時候,以上標識都不會生成,所以,如果去掉d。

    f()一句,程式將順利透過編譯)

    要解決這個問題,有兩個方法:

    1、過載函式f():此時由於我們明確定義了CD::f,編譯器檢查到CD::f()呼叫時就無需再像上面一樣去逐級生成CD::f標識了;

    此時CD的元素結構如下:

    |CB(CA)|

    |CC(CA)|

    故此時的sizeof(CD) = 8;(CB、CC各有一個元素k)

    2、使用虛擬繼承:虛擬繼承又稱作共享繼承,這種共享其實也是編譯期間實現的,當使用虛擬繼承時,上面的程式將變成下面的形式:

    #include

    #include

    class CA。

  • 2 # 家庭是我的家

    抽象類的定義:帶有純虛擬函式的類稱為抽象類,而抽象類只能作為基類來使用,所以只要有一個純虛擬函式的類叫抽象類,但基類不一定全是抽象類。

  • 中秋節和大豐收的關聯?
  • 做夢見到處找水,但是我不渴?