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;
}
Wynik:
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)