• 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

Object Storage Arubacloud
0 głosów
464 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ź 352 wizyt
0 głosów
3 odpowiedzi 298 wizyt
pytanie zadane 16 stycznia 2016 w C i C++ przez evergreen Użytkownik (680 p.)
0 głosów
1 odpowiedź 453 wizyt

92,543 zapytań

141,386 odpowiedzi

319,496 komentarzy

61,929 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

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy 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!

...