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