Wywolywanie destruktora wirtualnego

Wywolywanie destruktora wirtualnego
0

Mam pewne pytanie:

class Klasa1
{
....
virtual ~Klasa1()
{
...
}
};

class Klasa2: public Klasa1
{
~Klasa2(){ ... }
};

pozniej mam stworzona tablice
vector <Klasa1 *> tablica;

i w programie musze wywolac recznie destruktor w taki sposob:

tablica[ktor_element]->~Klasa1();

i moje pytanie czy wywoluje ten destruktor poprawnie? Chodzi o to czy jesli wyrazenie tablica[ktory_element] bedzie typu Klasa2 to czy wywola mi sie destruktor z tej klasy Klasa2, czy mimo tego, że jest to destruktor wirtualny zawsze bedzie wywolywac się ten destruktor Klasa1 bez wzgledu na typ jaki jest w tablicy?

Elles
nigdy tego nie rób, nie wywołuje się destruktora samodzielnie nigdy, poniewaz narażasz się na "double delete" -> crash programu, użyj std::unique_ptr dla tych elementów w obiekcie vector -> std::vector<std::unique_ptr<Klasa1> >, a element usuwasz za pomocą http://en.cppreference.com/w/cpp/container/vector/erase
Azarien
  • Rejestracja:ponad 21 lat
  • Ostatnio:około 12 godzin
2

To łatwo sprawdzić.

_13th_Dragon
  • Rejestracja:prawie 20 lat
  • Ostatnio:16 dni
0

Nie potrzebujesz wywołania destruktora, potrzebujesz zwolnienia pamięci, które automatycznie wywoła destruktor: delete tablica[ktor_element];


Wykonuję programy na zamówienie, pisać na Priv.
Asm/C/C++/Pascal/Delphi/Java/C#/PHP/JS oraz inne języki.
0

a czy jesli zrobie tablica.erase(tablica.begin()+element) , to czy to wyrazenie wywola mi destruktor czy to tak nie dziala?

_13th_Dragon
  • Rejestracja:prawie 20 lat
  • Ostatnio:16 dni
0

Jak chcesz działań automagicznych to użyj autoptr


Wykonuję programy na zamówienie, pisać na Priv.
Asm/C/C++/Pascal/Delphi/Java/C#/PHP/JS oraz inne języki.
_13th_Dragon
Cenna uwaga lecz nie ma zastosowania do powyższego pytania.
Elles
no pewnie, że nie ma jakbym mógł nie zauważyć, że to jego własna implementacja wektora, która trzyma pointery, ale ja jestem głupi przepraszam
_13th_Dragon
@Elles, kolejny raz masz problemy z czytaniem ze zrozumieniem. Nie chodzi o vector tylko o rodzaj wskaźnika, jego tak czy owak nie da się poprawnie skopiować ponieważ jest to wskaźnik do klasy bazowej. Więc jeżeli już zdecydowałeś się trzymać te wskaźniki w vector'ze to autoptr nic więcej nie popsuje.
Elles
albo ja mam problem z czytaniem ze zrozumieniem albo Ty jak zwykle proponujesz jakieś rozwiązania z epoki lodowcowej (na dodatek z udowodnionym złym użyciem), ale nie mi to oceniać, zawołaj kilku kumpli, niech napiszą co chcesz i będzie koniec tematu, ja i tak już napisałem do admina o usunięcie konta, nie da się wygrać z taką zatwardziałą skorupą, która się tutaj utworzyła na tym forum, to moje ostatnie podrygi, pozdrawiam
Azarien
  • Rejestracja:ponad 21 lat
  • Ostatnio:około 12 godzin
1

a czy jesli zrobie tablica.erase(tablica.begin()+element) , to czy to wyrazenie wywola mi destruktor czy to tak nie dziala?
To również łatwo sprawdzić.

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.