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

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

private并且package永远不是虚拟的。

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

于 2012-03-01T05:26:32.223 回答