Hallo,
mir ist beim Ableiten von cRecorder etwas aufgefallen. cRecorder erbt von cReceiver drei virtuelle Methoden:
virtual void Activate(bool On) {}
///< This function is called just before the cReceiver gets attached to
///< (On == true) and right after it gets detached from (On == false) a cDevice. It can be used
///< to do things like starting/stopping a thread.
///< It is guaranteed that Receive() will not be called before Activate(true).
virtual void Receive(uchar *Data, int Length) = 0;
virtual ~cReceiver();
Der übliche Weg des Abkoppelns eines Recorders ist, dass cRecorder in seinem Destructor Detach() aufruft, dieses cDevice::Detach(), das Device in seiner Liste den Recorder raussucht und darauf Activate(false) ruft. Jetzt kommt das Problem: Wenn ich in meiner abgeleiteten Klasse Activate() überschrieben habe, kommt dieser Aufruf gar nicht bei mir an. Mein Objekt ist ja schon halb abgebaut, wenn der Destructor von cRecorder am Werk ist. Im Callstack sieht das so aus:
[Blockierte Grafik: http://ein-eike.de/wordpress/wp-content/uploads/2014/04/virtual-method-in-desctructor.png]
Ich habe also das virtuelle Activate() überschrieben, um die Information, dass ich deaktiviert werde, zu bekommen, habe mich auf den normalen Informationsfluss des Deaktivierens verlassen, bekomme die Information aber nie.
Das ganze ließe sich umgehen, indem man im Destructor der abgeleiteten Klasse schon mal dasselbe macht, was in cRecorder dann nochmal passiert (in dem Fall dann vergebens, weil der Recorder schon ausgetragen wäre). Aber es kommt ziemlich überraschend und könnte Kopfzerbrechen bereiten...
Ciao,
Eike