Decimad schrieb:
Edit2: Herrje, wie funktioniert in solch einem Fall eigentlich das delete? Okay, die Zerstörung geht dank virtuellem Destruktor ja problemlos, aber wie bekommt delete die Richtige Basisadresse raus? Gibt's da eine versteckte virtuelle Funktion, die die Basisadresse der konkreten Klasse ausspuckt?
Naja, dass es für die Implementierung kein Problem sein kann/darf, die "Basisadresse" zu ermitteln, sollte ja wohl klar sein.
Der VTable-Zeiger eines z.B. Foo-Teilobjekts das Teil eines Bars ist zeigt (bei Mehrfachverrebung) ja nicht auf den Foo-VTable oder Bar-VTable, sondern auf einen speziellen Foo-in-Bar-VTable.
Da der VTable nicht nur die Adressen von virtuellen Funktionen enthält, sondern auch einen Zeiger auf Informationen über das Layout des konkreten Objekts, kann man da einiges machen.
Ist auch nötig, sonst könnte dynamic_cast nicht implementiert werden.
Und um deine konkrete Frage auch noch zu beantworten: ja, es gibt so eine Funktion, und zwar dynamic_cast<void*>(p) (wobei das nicht unbedingt eine versteckte virtuelle Funktion ist, aber es werden sicher Informationen aus dem VTable oder darin verlinkten Datenstrukturen verwendet). Das liefert die Adresse des "most derived object" -- also die Anfangsadresse des konkreten Objekts.
Das wird auch die Adresse sein die üblicherweise an operator delete übergeben wird. Bzw. ich meine sogar dass es immer die Adresse sein muss die an operator delete übergeben wird, ich glaube nicht dass der Standard hier genug Spielraum lässt es anders zu implementieren.