Znalazłem this one question asking the same thing, ale tylko "nowa" część została odebrana, więc znowu tutaj.Dlaczego operator usuwania musi być statyczny?
Dlaczego operator usuwania musi być statyczny? Jakoś to nie ma sensu. Nowy operator ma doskonały sens, tak jak konstruktor nie może być wirtualny, ani nowy operator. Jednak destruktor może (i powinien) być wirtualny, gdy używasz dziedziczenia, aby umożliwić niszczenie wykorzystywanych obiektów (za pomocą polimorfizmu) jako klasy bazowej.
Rozumiem, że gdy wywoływany jest operator delete, obiekt został już zniszczony, więc nie ma "tego". Jednak nadal ma sens, używając tego samego rozumowania, co w przypadku wirtualnego destruktora, aby operator delete pasował do nowego operatora, który utworzył obiekt.
To, co mam na myśli
class A
{
public:
virtual ~A() {}
};
class B : public A
{
public:
void* operator new (size_t sz);
void operator delete (void* ptr, size_t sz);
};
teraz jeśli robimy
A *ptr = new B();
delete ptr; // <-- fail
Skasuj operatora (domyślnie) powinien był nazywany, ponieważ jest statyczna i nie jest znana (do niczego, ale tutaj drobny przypadek) w czasie kompilacji, którego operator delete jest poprawny.
Jednak wykonałem mały program testowy z powyższym kodem (po prostu malloc/free w operatorze new/delete i print statement w delete) i skompilowałem go za pomocą g ++. Uruchomienie tego całkiem nieoczekiwanie spowodowało wyjście w operatorze kasowania B.
Moje (prawdziwe) pytanie brzmi następująco: Czy jest jakiś niejawny "wirtualność" dla operatora usuwania? Czy jest to statyczne tylko w tym sensie? Czy jest to tylko funkcja g ++?
Zacząłem przeglądać specyfikację C++, ale muszę przyznać, byłem nieco przytłoczony, więc każda pomoc doceniona.
Doskonale, dzięki! Grzebałem w 3.7.3 ... – falstro
Jest także wiele istotnych rzeczy w 5.3.5, a także 3.7.3 i 12.5. Mimo że jest to praca referencyjna, wydaje się, że musisz przeczytać okładkę, aby przeczytać w przeciwnym razie, nigdy nie dowiesz się, czy istnieje mały akapit odnoszący się do czegoś, co znajduje się w zupełnie innej sekcji, niż w rzeczywistości. patrząc. –