howto dispatch to derived classes?

Ali Çehreli acehreli at yahoo.com
Mon Oct 14 17:47:05 PDT 2013


On 10/14/2013 02:09 PM, Manfred Nowak wrote:

 >> class C{}
 >>    class C1:C{}
 >>    // ...
 >>    class Cn:C{}
 >>
 >> C getC(){ return new Cn;} // might be extern
 >>                            // and deliver some Ci
 >>
 >> void visit( C1 fp){}
 >> // ...
 >> void visit( Cn fp){}
 >> void main(){
 >>    visit( getC);           // dispatch?
 >> }
 >
 > -manfred
 >
 >            visit( getC);
 >          }
 >
 >

That it not exactly the same but looks like the visitor pattern. The 
actual type of the object is implicitly stored in the vtbl of each type. 
So, a virtual function like accept() can do the trick:

import std.stdio;

class C{
     abstract void accept();
}

class C1:C {
     override void accept() { visit(this); }
}

class Cn:C{
     override void accept() { visit(this); }
}

C getC(){ return new Cn;} // might be extern
                           // and deliver some Ci

void visit( C1 fp) {
     writeln("visiting C1");
}

void visit( Cn fp){
     writeln("visiting Cn");
}
void main(){
     getC().accept();
}

Ali



More information about the Digitalmars-d-learn mailing list