On Monday, 11 September 2017 at 15:13:25 UTC, jmh530 wrote:
I suppose my issue is that final should prevent function hijacking because I shouldn't be allowed to override string bar(double d) anyway. It shouldn't be a worry.

It has nothing to do with overriding. Consider:

import std.stdio;

class A {
    final void foo(int) {
        writeln("A.foo(int)");
    }
}

class B : A {
    final void foo(long) {
        writeln("B.foo(long)");
    }
}

void main() {
    B b = new B;
    int n = 1;
    b.foo(n);
}

That prints "B.foo(long)", even though foo() was called with an int (tbh, I'd say it's hijacking and shouldn't even compile, like it doesn't with virtual functions - try to remove finals). The compiler starts looking from B, finds name "foo" and tries that without looking any futher into base classes.

If you want that, you can do it manually:

class Foo2 : Foo
{
    alias bar = super.bar; // bring Foo.bars in scope
    override void bar(int x) { }
}

Reply via email to