覆盖D中的“包”成员函数

时间:2012-02-29 23:12:26

标签: d dmd

我在package protection attribute的类中有一个成员函数,我想在子类中,在同一个包中,不同的模块中覆盖它。 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
} 

1 个答案:

答案 0 :(得分:5)

publicprotected函数始终是虚拟的,除非编译器确定它可以优化它们以便它们是非虚拟的(只有在将它们标记为final时才会发生) ,它们不会覆盖任何东西)。如果编译器可以保证对象的确切类型,那么对虚拟函数的某些特定调用可能会优化为非虚拟函数,但这种情况不太可能经常发生,因为您可以知道对象的确切类型(通常只有在使用new)创建它之后,dmd通常会避开流量分析。

privatepackage永远不会是虚拟的。

在线文档 意味着您可以重载package,但这绝对不是编译器所做的,我99.99%肯定当前行为是预期的行为并将永远是行为。我试图在D新闻组上验证这一点。