La soluzione più semplice è utilizzare una classe base comune/un'interfaccia e un metodo virtuale, con una funzione per il dispatching.
codice:
class ClasseBase {
  virtual metodoComune();
};

class Derivata subclass ClasseBase {
  override metodoComune();
}

class Derivata1 subclass ClasseBase {
  override metodoComune();
}

ClasseBase create(dispatching_arg, args) {
  return (switch(dispatching_arg) {
    dispatch_Derivata: new Derivata(args);
    dispatch_Derivata1: new Derivata1(args);
  });
}

main() {
  //get dispatching_arg and args
  ClasseBase c = create(dispaching_arg, args);
  c.metodoComune();
}
In funzione di quello che devi fare ci sono poi svariate alternative.