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