2

package クラスに保護属性を持つメンバー関数があり、それを同じパッケージの別のモジュールのサブクラスでオーバーライドしたいと考えています。dmd コンパイラは、非仮想関数をオーバーライドできないと叫びます。関数を作成するとpublic、実際に機能します。

パッケージ関数が仮想ではないのはなぜですか?

コード例:

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
} 
4

1 に答える 1

5

publicおよびprotected関数は、コンパイラが非仮想になるように最適化できると判断しない限り、常に仮想です (これはfinal、それらを としてマークし、何もオーバーライドしない場合にのみ発生する可能性があります)。コンパイラがオブジェクトの正確な型を保証できる場合、仮想関数への特定の呼び出しの一部が非仮想に最適化される可能性がありますが、オブジェクトの正確な型を知ることは比較的まれであるため (通常は) で作成した直後new、および dmd は一般的にフロー分析を避けます。

privatepackage決して仮想ではありません。

オンライン ドキュメント、 をオーバーロードできることを暗示していますがpackage、これはコンパイラが行うことではありません。現在の動作が意図した動作であり、常に動作することは 99.99% 確信しています。ただし、Dニュースグループでそれを確認しようとしています。

于 2012-03-01T05:26:32.223 に答える