• 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
57 wizyt
pytanie zadane 3 grudnia 2016 w C i C++ przez użytkownika Sinnley Stary wyjadacz (10,080 punkty)

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 użytkownika Criss Szeryf (91,900 punkty)
wybrane 3 grudnia 2016 przez użytkownika Sinnley
 
Najlepsza
Dlatego właśnie destruktory w klasach bazowych powinny być wirtualne :P
komentarz 3 grudnia 2016 przez użytkownika Sinnley Stary wyjadacz (10,080 punkty)
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 użytkownika Criss Szeryf (91,900 punkty)
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 użytkownika Sinnley Stary wyjadacz (10,080 punkty)
Oki, no więc dzięki za pomoc... ponownie :)
komentarz 3 grudnia 2016 przez użytkownika Criss Szeryf (91,900 punkty)
Prosze, ponownie :)

Podobne pytania

0 głosów
1 odpowiedź 61 wizyt
pytanie zadane 24 grudnia 2016 w Java przez użytkownika nemezisso Użytkownik (860 punkty)
0 głosów
3 odpowiedzi 118 wizyt
pytanie zadane 16 stycznia 2016 w C i C++ przez użytkownika evergreen Użytkownik (670 punkty)
0 głosów
2 odpowiedzi 132 wizyt
pytanie zadane 3 lipca 2016 w C i C++ przez użytkownika endlesik Nowicjusz (150 punkty)
...