Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

Dziedziczenie - podejrzane wywolanie destruktorow ?

Ostatnio zmodyfikowano 2016-02-17 20:20
Autor Wiadomość
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.

C/C++
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 ];
}

C/C++
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

C/C++
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)



P-144964
Monika90
» 2016-02-17 20:10:38
C/C++
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:
C/C++
stopien::stopien_t nowa_lista( stopien::bravo );
P-144966
en2senpai
Temat założony przez niniejszego użytkownika
» 2016-02-17 20:20:15
Dziekuje Monika :D Pomoglo, zamykam temat.
P-144967
« 1 »
  Strona 1 z 1