No, porque quien hace la llamada es un procedimiento que nada tiene que ver con las clases (recibe el objeto como parámetro).
Creo que, después de pensarlo, he encontrado un punto de partida. El siguiente método es el de la clase "base":
Código Delphi
[-]
PROCEDURE TGTK_OBJECT.signal_connect (aName: Pgchar; aFunc: TGtkSignalFunc);
BEGIN
gtk_signal_connect (SELF.GtkObject, aName, aFunc, SELF);
END;
Lo que hace es registrar un procedimiento (pasado en el parámetro aFunc) para que sea utilizado como respuesta al evento 'aName'.
El procedimiento 'gtk_signal_connect' recibe, primero, el puntero al objeto GTK (algo así como el handle de un control Windows), el nombre del evento, el puntero de la función o procedimiento de respuesta del evento (no puede estar dentro de una clase) y un valor que será pasado a la función de respuestas al evento. Yo le paso la referencia al objeto para recuperarlo más tarde. Así, para el evento "destroy" utilizo la siguiente llamada:
Código Delphi
[-]
PROCEDURE _signal_destroy_ (ObjetoGTK: pGtkObject; aData: TGTK_OBJECT); CDECL;
BEGIN
aData.sDestroy;
END;
CONSTRUCTOR TGTK_OBJECT.Create (aGtkObject: PGtkObject);
BEGIN
fGtkObject := aGtkObject;
WriteLn ('Señales TGTK_OBJECT');
signal_connect ('destroy', GTK_SIGNAL_FUNC (@_signal_destroy_));
END;
El método 'sDestroy' es un método virtual. El problema está en que, aunque sobrecargue (OVERRIDE) dicho método en una clase hija, el procedimiento '_signal_destroy_' sigue llamando al método de la clase base (en este caso TGTK_OBJECT). Creo que el problema está en utilizar 'SELF' al llamar a 'gtk_signal_connect' pero, ¿de qué otra forma podría hacerlo sino?