2012-02-29 65 views
2

我有一個類的成員函數與packageprotection attribute,我想覆蓋它在一個子類,在同一個包,不同的模塊。 dmd編譯器大聲說我不能覆蓋非虛函數。如果我使功能public,它實際上工作。在D中覆蓋'包'成員函數

爲什麼包函數不是虛擬的?

示例代碼:

module test.A; 
class A { 
    package void doSomething() {} 
} 

module test.B; 
import test.A; 
class B : A { 
    package override void doSomething() {} // ERROR! overriding a non-virtual function 
} 
+0

是否受保護? – 2012-02-29 23:27:22

+1

從我看到的,B不是子類... – DejanLekic 2012-03-01 02:01:35

+0

對不起,我的例子中的錯誤。 B是一個子類,我會解決它。 '保護'確實有效,但我需要它'包',嘿嘿。 – 2012-03-01 04:03:25

回答

5

publicprotected功能總是虛除非編譯器決定,它可以優化他們,使他們非虛(其中,如果你將其標記爲final只能發生,並且它們不覆蓋任何東西)。如果編譯器可以保證對象的確切類型,那麼對虛擬函數的某些特定調用可能會被優化爲非虛擬的,但由於相對罕見,您可以知道對象的確切類型(通常只有在new創建之後),dmd通常會避開流程分析。

privatepackage從不虛擬。

在線文檔確實意味着你可以重載package,但這絕對不是編譯器做什麼,我99.99%肯定的是,目前的行爲是預期的行爲,而且將永遠是行爲。我試圖在D新聞組上進行驗證。