• 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

0 głosów
766 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,570 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,570 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,570 p.)
Prosze, ponownie :)

Podobne pytania

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

93,788 zapytań

142,753 odpowiedzi

323,429 komentarzy

63,393 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

Twierdza Linux. Bezpieczeństwo dla dociekliwych

Aby uzyskać rabat -10%, użyjcie kodu pasja-linux, wpisując go w specjalne pole w koszyku.

...