Problem z dziedziczeniem, konstruktor, destruktor

0

Piszę program, który służy do obsługi wypożyczalni (na zaliczenie). Zaprojektowałem już +/- klasy. Teraz zabrałem się za konstruktory i metody, i pojawiły się pierwsze problemy. Ze wcześniejszymi błędami sobie poradziłem, m.in. pola klasy ElementKolekcji zmieniłem z private na protected (nie wiem czy to eleganckie rozwiązanie). Nie bardzo wiem jak sobie poradzić.

Klasa ElementKolekcji

 
class ElementKolekcji
{
    protected:
        bool stan; //czy wypozyczone ? 0/1 nie/tak
        string tytul;
        string autor;
        string gatunek;
        short data_wypozyczenia[7];
        short termin_zwrotu[7];
        short data_wydania[7]; //ddmmrrrr
        float cena;
        short liczba_sztuk;
    public:
        ElementKolekcji(
            string Ntytul,
            string Nautor,
            string Ngatunek,
            //short Ndata_wypozyczenia[7],
            //short Ntermin_zwrotu[7],
            //short Ndata_wydania[7],
            float Ncena,
            short Nliczba_sztuk);
        virtual ~ElementKolekcji();
        void dodaj_pozycje();
        void pobierz_pozycje();
};

Destruktor klasy ElementKolekcji

 
ElementKolekcji :: ElementKolekcji(
        string Ntytul,
        string Nautor,
        string Ngatunek,
        //short Ndata_wypozyczenia[7],
        //short Ntermin_zwrotu[7],
        //short Ndata_wydania[7],
        float Ncena,
        short Nliczba_sztuk)
        {
            tytul=Ntytul;
            autor=Nautor;
            gatunek=Ngatunek;
            //data_wypozyczenia[7]=Ndata_wypozyczenia[7];
            //termin_zwrotu[7]=Ntermin_zwrotu[7];
            //data_wydania[7]=Ndata_wydania[7];
            cena=Ncena;
            liczba_sztuk=Nliczba_sztuk;
        }

Klasa Ksiazka dziedzicząca po Element Kolekcji

 
class Ksiazka : public ElementKolekcji
{
    private:
        short id;
        bool okladka; // 0/1 miekka/twarda
        short liczba_stron;
        short isbn[12]; // 13-cyfrowy ISBN
        string wydawnictwo;
    public:
        Ksiazka(
            string Ntytul,
            string Nautor,
            string Ngatunek,
            string Nwydawnictwo,
            //short Ndata_wydania[7],
            //short Nisbn[12],
            short Nliczba_sztuk,
            short Nid,
            short Nliczba_stron,
            float Ncena,
            bool Nokladka);
        ~Ksiazka();

};

Destruktor klasy Ksiazka

 
Ksiazka :: Ksiazka(
        string Ntytul,
        string Nautor,
        string Ngatunek,
        string Nwydawnictwo,
        //short Ndata_wydania[7],
        //short Nisbn[12],
        short Nliczba_sztuk,
        short Nid,
        short Nliczba_stron,
        float Ncena,
        bool Nokladka
    ):ElementKolekcji(
        Ntytul,
        Nautor,
        Ngatunek,
        //short Ndata_wypozyczenia[7],
        //short Ntermin_zwrotu[7],
        //short Ndata_wydania[7],
        Ncena,
        Nliczba_sztuk
    )
    {
        tytul=Ntytul;
        autor=Nautor;
        gatunek=Ngatunek;
        wydawnictwo=Nwydawnictwo;
        //data_wydania=Ndata_wydania[7];
        //isbn[12]=Nisbn[12];
        liczba_sztuk=Nliczba_sztuk;
        id=Nid;
        liczba_stron=Nliczba_stron;
        cena=Ncena;
        okladka=Nokladka;
    }

Błędy:

undefined reference to vtable for ElementKolekcji'** **undefined reference to vtable for ElementKolekcji'
obj\Debug\main.o||In function Ksiazka':** **undefined reference to vtable for Ksiazka'
undefined reference to ElementKolekcji::~ElementKolekcji()'** **undefined reference to vtable for Ksiazka'
undefined reference to `ElementKolekcji::~ElementKolekcji()'

2

Zdeklarowałeś wirtualny destruktor ale nigdzie nie napisałeś jego definicji (nawet jeśli pusta to musisz ją napisać)

0

Dzięki. No i destruktory klas funkcji pochodnych też powinienem zdefiniować.

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.