This code: import std.stdio; class A { void func() { writeln("A"); } } class B : A { override void func() { writeln("B"); } } void main() { A a = new A; B b = new B; auto dg = &a.func; dg(); dg.ptr = cast(void*)b; dg(); } outputs: A A but expected: A B