我在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
}
答案 0 :(得分:5)
public
和protected
函数始终是虚拟的,除非编译器确定它可以优化它们以便它们是非虚拟的(只有在将它们标记为final
时才会发生) ,它们不会覆盖任何东西)。如果编译器可以保证对象的确切类型,那么对虚拟函数的某些特定调用可能会优化为非虚拟函数,但这种情况不太可能经常发生,因为您可以知道对象的确切类型(通常只有在使用new
)创建它之后,dmd通常会避开流量分析。
private
和package
永远不会是虚拟的。
在线文档 意味着您可以重载package
,但这绝对不是编译器所做的,我99.99%肯定当前行为是预期的行为并将永远是行为。我试图在D新闻组上验证这一点。