delegate cannot handle polymorphism?
Michel Fortin
michel.fortin at michelf.com
Mon Jun 27 04:08:56 PDT 2011
On 2011-06-27 03:30:09 -0400, Nub Public <nubpublic at gmail.com> said:
> class B
> {
> void fun() { writeln("B"); }
> }
>
> class D : B
> {
> override void fun() { writeln("D"); }
> }
>
> void delegate() dg = &b.fun;
> dg.ptr = cast(void*)d;
> dg();
>
>
> Compiler: DMD 2.053
> It prints "B" instead of "D".
> The equivalent code in C++ prints "D" nicely.
C++ doesn't have delegates, and D doesn't have member function
pointers. Resolving virtual functions is done while you take its
address in D, while in C++ the member function pointer type contains
holds the vtable offset (or several in the case of multiple
inheritance) which gets resolved only when you call the function.
If you want the C++ behaviour, try using a delegate literal as a
trampoline that gets the object as a parameter to then call your
function:
void delegate(B b) dg = (B b) { b.fun(); };
dg(d);
--
Michel Fortin
michel.fortin at michelf.com
http://michelf.com/
More information about the Digitalmars-d
mailing list