覆盖D中的"包"成员函数

San*_* V. 2 d dmd

我在具有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
} 
Run Code Online (Sandbox Code Playgroud)

Jon*_*vis 5

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

private并且package永远不会虚.

在线文档确实暗示您可以重载package,但这绝对不是编译器所做的,并且我99.99%确定当前行为是预期的行为并且将始终是行为.我试图在D新闻组上验证这一点.