On Friday, 16 November 2018 at 15:59:14 UTC, Vinay Sajip wrote:
This code should IMO give at least a warning, but it doesn't:

abstract class A {
    int kind;
}

class B : A {
    int kind;

    this(int k) {
        kind = k;
    }
}

In my actual code, the declaration of field "kind" in B was left in accidentally. Surprisingly, however, no warning was emitted when I compiled this, leading to B having two fields called kind which are distinct from one another. The complete program

import std.stdio;

abstract class A {
    int kind;
}

class B : A {
    int kind;

    this(int k) {
        kind = k;
    }
}

void main()
{
    auto b = new B(4);
    A a = b;

    writeln(b.kind);
    writeln(a.kind);
}

prints

4
0

Given that this is the kind of thing that is easily done, surely the default behaviour should be for the compiler to emit at least a warning that field "kind" is ambiguous in B? This behaviour occurs even when the field is declared as "public" or "protected" in both classes. What am I missing?

When you re declare with the same name in a sub class each generation has its own variable. To distinguish you can use the type for which you want "kind":

    writeln(b.A.kind); // the one from A
    writeln(b.B.kind); // the one from B

I agree that this is almost a case of shadowing but i don't know the exact rationale for allowing this.

Reply via email to