• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Dziedziczenie a konstruktory i destruktory i ich wywołanie

VPS Starter Arubacloud
0 głosów
463 wizyt
pytanie zadane 3 grudnia 2016 w C i C++ przez Sinnley Stary wyjadacz (12,810 p.)

Mam sobie taki kod.

class Mother {


public:

	Mother() {
		cout << "Im mother" << endl;
	}
	~Mother() {

		cout << "I died" << endl;

	}

};
class Daugther : public Mother {

public:

	Daugther(){

		cout << "Im daughter" << endl;

	}
	~Daugther() {
		cout << "ehh ";
	}

	

};

int main() {

	Mother* a = new Mother();
	Mother* b = new Daugther();
	Daugther* c = new Daugther();
	delete a;
	delete b;
	delete c;

	cin.get();
	return 0;
}

Po uruchomieniu programu pojawia się taki wynik:
Im mother
Im mother
Im daughter
Im mother
Im daughter
I died
I died
ehh I died

Dla córki więc konstruktor uruchomił się za każdym razem poprawnie, bo mamy dwa Im daughter.
Dlaczego jednak destruktor dla córki uruchomił się tylko raz, skoro przecież mogę chyba użyć wskaźnika na klase matke jako wskaznik na córke?

 

1 odpowiedź

+3 głosów
odpowiedź 3 grudnia 2016 przez criss Mędrzec (172,590 p.)
wybrane 3 grudnia 2016 przez Sinnley
 
Najlepsza
Dlatego właśnie destruktory w klasach bazowych powinny być wirtualne :P
komentarz 3 grudnia 2016 przez Sinnley Stary wyjadacz (12,810 p.)
A jest jakiś konkretny powód, dla którego to nie działa? Skoro konstuktor się wykonał, to dlaczego destruktor nie?
1
komentarz 3 grudnia 2016 przez criss Mędrzec (172,590 p.)
Na takiej samej zasadzie na jakiej działają metody wirtualne. Jeśli klasa bazowa i klasa dziecko mają taką samą metode, ale nie wirtualną, to wywołując z pod wskaźnika na klase bazową, zawołana zostanie metoda klasy bazowej. Jeśli jednak byłaby to metoda wirtualna, to zostanie zawołana metoda klasy obiektu kryjącego się pod wskaźnikiem.

Tak naprawde zwalnianie obiektu klasy dziecka z pod wkaźnika na klase bazową z nie-wirtualnym destruktorem to wg standardu jest UB, ale większość kompilatorów po prostu zawoła destruktor klasy bazowej.
komentarz 3 grudnia 2016 przez Sinnley Stary wyjadacz (12,810 p.)
Oki, no więc dzięki za pomoc... ponownie :)
komentarz 3 grudnia 2016 przez criss Mędrzec (172,590 p.)
Prosze, ponownie :)

Podobne pytania

0 głosów
1 odpowiedź 351 wizyt
0 głosów
3 odpowiedzi 295 wizyt
pytanie zadane 16 stycznia 2016 w C i C++ przez evergreen Użytkownik (680 p.)
0 głosów
1 odpowiedź 450 wizyt

92,454 zapytań

141,263 odpowiedzi

319,099 komentarzy

61,854 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Akademia Sekuraka 2024 zapewnia dostęp do minimum 15 szkoleń online z bezpieczeństwa IT oraz dostęp także do materiałów z edycji Sekurak Academy z roku 2023!

Przy zakupie możecie skorzystać z kodu: pasja-akademia - użyjcie go w koszyku, a uzyskacie rabat -30% na bilety w wersji "Standard"! Więcej informacji na temat akademii 2024 znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...