Was kann einen rein virtuellen Funktionsaufruf in C ++ verursachen?
Unterrichte ich eine C++ - Programmierung Klasse und ich habe genug gesehen-Klassen von Fehlern, die ich habe ein gutes Gefühl für, wie Sie zu diagnostizieren gemeinsamen C++ Fehler. Es gibt jedoch eine wichtige Art von Fehler, für die meine intuition ist nicht besonders gut: was Fehler in der Programmierung verursachen Aufrufe von rein virtuellen Funktionen? Die häufigsten Fehler, die ich gesehen habe, dass die Ursachen dieser ruft eine virtuelle Funktion in einer Basisklasse Konstruktor oder Destruktor. Gibt es andere, die ich bewusst sein sollten, wenn das helfen debug student code?
InformationsquelleAutor der Frage templatetypedef | 2011-01-06
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wenn ein Objekt konstruiert wird, der pointer auf die virtual dispatch-Tabelle ist zunächst richtet sich an der höchsten Oberklasse, und es wird nur aktualisiert, wenn die intermediate-Klassen, die komplette Konstruktion. So können Sie versehentlich Aufruf der rein virtuellen Umsetzung bis zu dem Punkt, dass eine Unterklasse mit Ihren eigenen überschreiben-Funktion-Durchführung - Abschluss Bau. Das mag die meisten abgeleiteten Unterklasse, oder irgendwo dazwischen.
Kann es passieren, wenn Sie Folgen Sie einen Zeiger auf eine teilweise errichtete Objekt (z.B. eine race condition wegen async oder Thread-Operationen).
Wenn ein compiler hat Grund zu glauben, es kennt die wahre Art, auf die ein pointer-to-base-class-Punkte, es kann vernünftigerweise umgehen den virtuellen Versand. Sie verwirren könnte es etwas zu tun mit undefinierten Verhalten wie ein neu gegossen.
Während der Zerstörung, die virtual dispatch-Tabelle sollte rückgängig gemacht werden als abgeleitete Klassen sind zerstört, so dass das rein virtuelle Umsetzung kann wieder aufgerufen werden.
Nach der Zerstörung weitere Nutzung des Objekts über "baumelt" Zeiger oder Referenzen kann sich auf die rein virtuelle Funktion, aber es gibt keine definierte Verhalten in solchen Situationen.
InformationsquelleAutor der Antwort Tony Delroy
Hier sind ein paar Fälle, in denen eine rein virtuelle call passieren kann.
static_cast
auf die falsche Art (oder auch C-style-cast) kann auch dazu führen, das Objekt, das Sie zeigen, nicht die richtigen Methoden in der virtuellen Tabelle (in diesem Fall zumindest ist es wirklich ist eine virtuelle Tabelle im Gegensatz zu der vorherigen option).InformationsquelleAutor der Antwort Motti
Dies kann beispielsweise passieren, wenn die Referenz oder ein Zeiger auf ein Objekt gerichtet ist, auf eine NULL-Position, und verwenden Sie die Objekt-Referenz oder ein Zeiger zum aufrufen einer virtuellen Funktion in der Klasse. Zum Beispiel:
In diesem point-Objekt gespeichert in objContainer[0] ist nicht vorhanden. Wenn die virtuelle Tabelle indiziert ist, wird keine gültige Speicheradresse zu finden ist. Daher wird ein Laufzeitfehler ausgegeben wird, nämlich "rein virtuelle Funktion" nennt.
InformationsquelleAutor der Antwort cppcoder