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) { }
}