Ich habe this one question asking the same thing gefunden, allerdings wurde nur der 'neue' Teil beantwortet, also geht es hier nochmal.Warum muss der Löschoperator statisch sein?
Warum muss der Löschoperator statisch sein? Irgendwie macht das keinen Sinn. Der neue Operator macht durchaus Sinn, genauso wie der Konstruktor nicht virtuell sein kann, genauso wenig wie der neue Operator. Der Destruktor kann (und sollte) jedoch virtuell sein, wenn Sie Vererbung verwenden, um die Zerstörung von Objekten zu ermöglichen, die (als Polymorphismus) als Basisklasse verwendet werden.
Ich verstehe, dass, wenn der Löschen-Operator aufgerufen wird, das Objekt bereits zerstört wurde, so dass kein "das" existiert. Dennoch macht es immer noch Sinn, den Löschoperator mit dem gleichen Operator wie beim virtuellen Destruktor auf den neuen Operator abzustimmen, der das Objekt erstellt hat.
Dies ist, was ich
class A
{
public:
virtual ~A() {}
};
class B : public A
{
public:
void* operator new (size_t sz);
void operator delete (void* ptr, size_t sz);
};
jetzt bedeuten, wenn wir genannt habe
A *ptr = new B();
delete ptr; // <-- fail
A der Delete-Operator (default) tun sollte, da es statisch ist und es nicht bekannt ist (für alles andere als der triviale Fall hier) zur Kompilierzeit, welcher delete-operator der richtige ist.
Ich habe jedoch ein kleines Testprogramm mit dem obigen Code (nur malloc/free in den neuen/löscht-Operatoren und print-Anweisung in delete), und kompiliert es mit g ++. Es wurde ganz unerwartet ausgeführt, um die Ausgabe in Bs Löschoperator zu erzeugen.
Meine (echte) Frage ist diese: Gibt es eine implizite "Virtualität" für den Löschoperator? Ist es nur statisch im Nicht-diesem-Zeiger-Sinn? Oder ist das nur eine g ++ Funktion?
Ich fing an, durch die C++ - Spezifikation zu suchen, aber ich muss zugeben, ich war etwas überwältigt davon, so dass jede Hilfe geschätzt wurde.
Ausgezeichnet, danke! Ich habe in 3.7.3 gewühlt ... – falstro
Es gibt auch relevante Sachen in 5.3.5 sowie 3.7.3 und 12.5. Obwohl es als Nachschlagewerk in Rechnung gestellt wird, scheint es, dass Sie es lesen müssen, um es zu bedecken, sonst würden Sie nie wissen, ob es einen kleinen Absatz gab, der für etwas relevant ist, das Sie in einem völlig anderen Abschnitt nachschlagen schauend. –