Unbeabsichtigter Aufruf einer virtuellen Methode.

"Das Einfügen an den Anfang ist einfacher und deutlich schneller, bei einer einfach verketteten Liste.
Hinten einhängen und von Vorn durchlaufen, erfordert eine doppelt verkettete Liste.
Und damit quasi den doppelten Verarbeitungsaufwand bei Veränderungen und den doppelten Speicher Aufwand."

Tut mir leid, auch das ist Unsinn!

Deine Version - zufügen am Anfang:

void add(Node *client)
  {
    Node *temp = first;
    first = client;
    client->next = static_cast<ClientClass *>(temp);
  }

Ein Pointer auf den letzen Eintrag reicht völlig aus.

Meine Version - zufügen am Ende:

void add(Node *client)
{
  if (end) end->next = static_cast<ClientClass *>(client);
  else first=client;
  end = client;
}

Diese kleine Änderung - ohne jede sonstige Modifikation im Programm - sorgt für Abhilfe.
Einen großen Mehraufwand an Zeit und Code sehe ich nicht.

Kannst Du wenigsten hier mal zugeben, Unrecht gehabt zu haben ? :wink: