没想到遇到这种低级错误

oldrev 2007-04-26
子类居然没有继承超类的非虚方法?

class A
{
	public abstract void foo(int x);
	public void foo(double a){}
}

class B : A
{
	public override void foo(int x){};
}

void main()
{
	B a = new B;
	a.foo(1);
	a.foo(1.0); //error: function B.foo (int) does not match parameter types (double)
}
oldrev 2007-04-26
准确地说应该是超类的同名方法未被继承,不知道这是不是一个特性
oldrev 2007-04-26
呜呜呜呜,找到了,在 functions 里,读的不仔细啊
qiezi 2007-04-26
的确是个八哥亚,好像就float和double会这样。
qiezi 2007-04-26
qiezi 写道
的确是个八哥亚,好像就float和double会这样。

搞错了。。float和double不能隐式转换成int,所以编译错误,其它几个类型如char/long都可以隐式转成int,所以编译通过,但实际上还是没效果的。
oldrev 2007-04-26
file:///D:/usr/share/dmd/html/d/function.html
文档里有,看样子不是bug,但是这个太麻烦了

class B : A
{
    alias A.foo foo;
}

这样才行
qiezi 2007-04-26
我觉得奇怪的一点,这个文档也说了“All non-static non-private non-template member functions are virtual.”,所有非static,非私有,非模板成员函数都是虚函数,那上面这个至少也是个虚函数亚,即便是有虚函数调用优化,也不应该改变语意才对。public白趴了?
Colorful 2007-04-26
D文档里写着呢,when doing overload resolution, the functions in the base class are not considered。
上面的情况正好符合。

PS:D里面的陷阱也不少,哈哈。
oldrev 2007-04-26
现在D感觉比C++还难啊
DavidL 2007-04-26
其实这个是D的一个设计上的改良,就是继承的类应该显式地表述我这个类的函数接口想和父类的函数接口共存,这样写这个alias的时候这个类的设计者才能做到清醒认识是否需要expose父类的接口
Global site tag (gtag.js) - Google Analytics