• 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
66 wizyt
pytanie zadane 3 grudnia 2016 w C i C++ przez Sinnley Stary wyjadacz (12,010 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 VIP (115,800 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,010 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 VIP (115,800 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,010 p.)
Oki, no więc dzięki za pomoc... ponownie :)
komentarz 3 grudnia 2016 przez Criss VIP (115,800 p.)
Prosze, ponownie :)

Podobne pytania

0 głosów
1 odpowiedź 91 wizyt
0 głosów
3 odpowiedzi 123 wizyt
pytanie zadane 16 stycznia 2016 w C i C++ przez evergreen Użytkownik (670 p.)
0 głosów
2 odpowiedzi 161 wizyt
Obowiązuje już zaktualizowany regulamin.

Czy wiesz, że nie musisz już odświeżać strony głównej?

Lista pytań i odpowiedzi aktualizuje się automatycznie!

38,612 zapytań

76,496 odpowiedzi

149,409 komentarzy

18,072 pasjonatów

Przeglądających: 247
Pasjonatów: 21 Gości: 226

Motyw:

Akcja Pajacyk

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

Oto dwie polecane książki warte uwagi. Pełną listę znajdziesz tutaj.

...