Dziedziczenie - podejrzane wywolanie destruktorow ?
Ostatnio zmodyfikowano 2016-02-17 20:20
en2senpai Temat założony przez niniejszego użytkownika |
Dziedziczenie - podejrzane wywolanie destruktorow ? » 2016-02-17 19:38:51 Witam, Pracuje nad 2 klasami. 1 z nich jest klasa bazowa, ktora obrazuje liste jako zbior wartosci, posiadajaca metody do wyswietlania jej elementow. Klasa 2 jest juz konkretna realizacja listy, wiec dziedziczy publicznie po klasie lista_t. Oto definicje i implementacje klas. class lista_t { protected: std::string * wsk_nazwa_skrocona; int wybrany_element; public: lista_t(); virtual ~lista_t(); std::string nazwa_skrocona(); };
lista_t::lista_t() { std::cout << "Konstruktor klasa bazowa, " << "ustawiam zmienna indeksu z " << wybrany_element << " na " << 0 << std::endl; wybrany_element = 0; }
lista_t::~lista_t() { std::cout << "Destruktor klasa bazowa" << std::endl; }
std::string lista_t::nazwa_skrocona() { std::cout << "metoda nazwa skrocona " << wsk_nazwa_skrocona << " " << wybrany_element << std::endl; return wsk_nazwa_skrocona[ wybrany_element ]; }
namespace stopien { enum lista { alfa, bravo }; class stopien_t : public lista_t { public: stopien_t( stopien::lista st ); ~stopien_t(); }; stopien_t::stopien_t( stopien::lista st ) { std::cout << "Konstruktor klasa pochodna, ustawiam zmienna indeksu z " << wybrany_element << " na " << st << std::endl; wybrany_element = st; wsk_nazwa_skrocona = new std::string[ 2 ]; std::cout << "Konstruktor klasa pochodna, przydzielam pamiec - przydzielono adres " << wsk_nazwa_skrocona << std::endl; wsk_nazwa_skrocona[ 0 ] = "ALFA"; wsk_nazwa_skrocona[ 1 ] = "BRAVO"; } stopien_t::~stopien_t() { std::cout << "Destruktor klasa pochodna" << std::endl; delete[] wsk_nazwa_skrocona; } }
W pliku main mam cos takiego int main() { lista_t nowa_lista = stopien::stopien_t( stopien::bravo ); system( "pause" ); return 0; }
Wynikiem dzialania programu jest co nastepuje:
Konstruktor klasa bazowa, ustawiam zmienna indeksu z 17174570 na 0 Konstruktor klasa pochodna, ustawiam zmienna indeksu z 0 na 1 Konstruktor klasa pochodna, przydzielam pamiec - przydzielono adres 00CC8544 Destruktor klasa pochodna Destruktor klasa bazowa Press any key to continue . . .
Dlaczego od razu po utworzeniu obiektu, wywolywane sa obydwa destruktory? (po nacisnieciu czegokolwiek poprawnie dziala destruktor klasy bazowej) |
|
Monika90 |
» 2016-02-17 20:10:38 lista_t nowa_lista = stopien::stopien_t( stopien::bravo );
Tworzony jest obiekt tymczasowy typu stopien_t, następnie jego podobiekt klasy bazowej jest użyty do zainicjalizowania definiowanej zmiennej nowa_lista za pomocą konstruktora kopiującego (nazywa się to slicing). Na koniec niepotrzebny już obiekt tymczasowy jest niszczony stąd te destruktory. Innymi słowy to co robisz jest bez sensu i zrób po prostu tak: stopien::stopien_t nowa_lista( stopien::bravo );
|
|
en2senpai Temat założony przez niniejszego użytkownika |
» 2016-02-17 20:20:15 Dziekuje Monika :D Pomoglo, zamykam temat. |
|
« 1 » |