Hola solarin.
Eso es debido a que en la función trabajas con las clases hijas a través de un puntero de tipo clase padre.
Si el número de clases que heredan de Notifier no es muy elevado puedes utilizar typeid o dynamic_cast para saber el nombre de la clase hija, utilizandolo de la siguiente manera:
void NotifyWarningMessage(Notifier* noti, Message msg){
if(typeid(*noti) == typeid(ClaseQueHeredaDeNotifier1)){
cout << "La clase es de tipo ClaseQueHeredaDeNotifier1" << endl;
}
if(typeid(*noti) == typeid(ClaseQueHeredaDeNotifier2)){
cout << "La clase es de tipo ClaseQueHeredaDeNotifier2" << endl;
}
if(typeid(*noti) == typeid(ClaseQueHeredaDeNotifier3)){
cout << "La clase es de tipo ClaseQueHeredaDeNotifier3" << endl;
}
... //Así sucesivamente con todas las clases que heredan de Notifier
}
La otra opción es utilizar dynamic_cast<> de la misma forma. Este operador sirve para hacer casting dinámico, es decir, tienes una clase padre, y de ella heredan varias clases hijas (como en tu caso), pues si instancias varias clases hijas utilizando para ello un puntero de la clase padre, con dynamic_cast puedes transformar ese objeto a un objeto manejado a través de un puntero de la clase hija a la que pertenece. Es algo engorroso, aquí un ejemplo para aclarar:
//Punteros de la clase padre
Notifier* x;
Notifier* y;
/* Instanciamos objetos de tipo "clases que heredan de notifier" con punteros de la clase padre */
x = new ClaseQueHeredaDeNotifier1();
y = new ClaseQueHeredaDeNotifier2();
//Ahora ponemos ejemplos de cuando se puede llevar a cabo el casting dinámico
/* Este casting es posible ya que en x hay instanciado un objeto de tipo ClaseQueHeredaDeNotifier1 */
ClaseQueHeredaDeNotifier1* c;
c = dynamic_cast<ClaseQueHeredaDeNotifier *>(x);
/* Este casting no es posible ya que en y el objeto que hay instanciado no es de tipo ClaseQueHeredaDeNotifier1 */
ClaseQueHeredaDeNotifier1* v;
v = dynamic_cast<ClaseQueHeredaDeNotifier1 *>(y);
NOTA: Cuando dynamic_cast<> se lleva a cabo satisfactoriamente devuelve un puntero hacia el objeto ya convertido a la clase deseada. Cuando falla devuelve 0.
Bien, pues para saber el nombre de la clase hija lo utilizamos de la siguiente manera:
void NotifyWarningMessage(Notifier* noti, Message msg){
ClaseQueHeredaDeNotifier1* x;
if(x = dynamic_cast<ClaseQueHeredaDeNotifier1*>(noti)){
cout << "ClaseQueHeredaDeNotifer1" << endl;
}
ClaseQueHeredaDeNotifier2* y;
if(y = dynamic_cast<ClaseQueHeredaDeNotifier2*>(noti)){
cout << "ClaseQueHeredaDeNotifer2" << endl;
}
... //Así sucesivamente con todas las clases que heredan de Notifier
}
En fin, espero que te sea de utilidad.
Saludos.