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.

Reply via email to