delegate cannot handle polymorphism?

Steven Schveighoffer schveiguy at yahoo.com
Tue Jun 28 04:13:09 PDT 2011


On Mon, 27 Jun 2011 22:23:32 -0400, Nub Public <nubpublic at gmail.com> wrote:


> I have to disagree on this.
> Member function pointers are useful in many event handling systems.  
> Imagine a signal and slot system. To register a member function as a  
> slot, the most direct and intuitive way is to take a member function  
> pointer. In c++0x and boost, <function>, <functional> and related  
> libraries all work with member function pointers.
>
> My premise is simple: a virtual function should always be resolved by  
> the dynamic identity of the object, regardless of whether it is called  
> directly or through a function pointer.

This can be had using delegates, but it's not straightforward, you need to  
do a little bit of extra work.

For example, if you did this:

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

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

A delegate to callFoo would do polymorphism, even when you change the  
context pointer (to a compatible instance).

Note that it is highly unusual to change anything about a delegate, as  
type checking the context pointer is out the window.  In fact, it is the  
property of delegates which makes them so useful -- because you don't have  
to care what the type of the context pointer is, the delegate's type does  
not depend on it.

> Perhaps the contextptr of D delegate cannot do this because it can refer  
> to the enclosing context besides an object. But I'd love it for D to  
> have the functionality of a truly polymorhic member function pointer.  
> Maybe the restrictions on the keyword "function" can be relaxed to work  
> with such a pointer?

The easiest thing to do is the suggestion from Michel Fortin -- create a  
function/delegate that accepts the base type.  This is much safer as  
well.  I would be highly suspect of code that alters any delegate  
components.

-Steve


More information about the Digitalmars-d mailing list