On Saturday, 22 February 2014 at 17:41:58 UTC, Ali Çehreli wrote:
The code uses the two objects through the A interface and x()
is a virtual function on that interface.
When the C interface is used then we get C.x, which happens to
be hiding the x() function of the base class.
It looks normal to me.
Ali
Spec is silent on this, so this is indeed a question.
Actually A is not interface, so I don't understand why you
mention it. And there is neither 'taking C interface' because
static type is A, so A function is called, neither it hides
function of the base class because it is base class function
which is called. I don't understand you completely.
AFAIK this feature exists for many years, at least 3, possibly
roots to D1. What happens is follows: since there is no function,
base class virtual is not replaced, so virtual table of C looks
like A, so A member function is called.
If example is modified, then
import std.stdio;
class A {
//string x () { return "A"; };
string x = "A";
}
class B : A {
//override string x () { return "B"; };
string x = "B";
}
class C : A {
//string x = "C"; // should this be illegal?
string x () { return "C"; }
}
void main () {
A o1 = new B();
A o2 = new C();
writeln(o1.x); // A
writeln(o2.x); //A
}
so it appears that data member have priority over function.
Probably this should be filed as a spec or compiler bug.