Dziedziczenie, konstruktor

0

Witam napisałem taki kod, do momentu gdy nie dodałem pochodnej klasy"Ptak" wszystko działało, chcę teraz dodać tą klasę, ale napotykam problem:
Undefined reference to 'vtable' for Ptak
Czy statyczna zmienna jest także dziedziczona ? Jeśli tak chciałbym aby licznik obiektów był osobny dla Ptak a dla klasy bazowej.

#include <iostream>

using namespace std;

////////////////////////////////////////////////////////////////////////////////////

class Zwierze {
private:
    static int liczba_obiektow;
    string nazwa;
    int liczba_konczyn;
public:
    void przemieszczaj();
    static void wypisz_liczbe_obiektow();
    virtual void wypisz(ostream& out);
    void ubij_obiekt();
    friend ostream& operator<<(ostream& out, Zwierze& zwierz);
    Zwierze();
    ~Zwierze(){ubij_obiekt();};
};

int Zwierze::liczba_obiektow = 0 ;

void Zwierze::ubij_obiekt() {
    Zwierze::liczba_obiektow--;
}

Zwierze::Zwierze() {
    liczba_obiektow++;
    nazwa="brak";
    liczba_konczyn=0;
}

ostream& operator<<(ostream& out, Zwierze& zwierz) {
    zwierz.wypisz(out);
    return out;
}

void Zwierze::wypisz(ostream& out) {
    out << "Nazwa: " << nazwa << endl ;
    out << "Liczba obiektow: " << liczba_obiektow << endl ;
    out << "Liczba konczyn: " << liczba_konczyn << endl ;
}

void Zwierze::przemieszczaj() {
    cout << "Poruszam bazowym obiektem." << endl ;
}

void Zwierze::wypisz_liczbe_obiektow(){
    cout << "Ilosc obiektow: " << liczba_obiektow << endl;
}

////////////////////////////////////////////////////////////////////////////////////////

class Ptak:public Zwierze {
private:
    int liczba_nog;
    int liczba_skrzydel;
public:
    Ptak():Zwierze(){
        liczba_nog = 2;
        liczba_skrzydel = 2; 
    };
    ~Ptak(){Zwierze::ubij_obiekt();};
    void przemieszczaj();
    void wypisz(ostream& out);
};

////////////////////////////////////////////////////////////////////////////////////////
int main()
{
    Zwierze z1;
    Zwierze z2;
    Ptak p1;
    cout << z1;
    cout << z2;
    return 0;
}

0

Nieprawidłowo wywołany jest ctor Zwierze w ctorze Ptak, oraz nie ma zdefiniowanego ctora Zwierze z parametrami, jakie chcesz przekazać.
Ptak():Zwierze(2, 2){} - tak powinno to wyglądać.
Należy dopisać brakujący ctor.
Dtor klasy bazowej powinien być virtual, razem z zakrywanymi metodami.
http://en.cppreference.com/w/cpp/language/rule_of_three

0

Poza tym klasa Zwierze powinna być abstrakcyjna. Czym jest Zwierze? Jak wygląda? Ile ma nóg? Co je? Potrafisz to powiedzieć? Zwierze jest pojęciem abstrakcyjnym i tu powinno być abstrakcyjną klasą.

Co więcej zmniejszanie licznika zwierząt powinno odbywać się w destruktorze klasy Zwierze. Tylko. A Ty nie dość, że wywołujesz w destruktorze, to jeszcze wywołujesz to drugi raz w destruktorze klasy pochodnej. Po jednym takim cyklu będziesz miał ujemną liczbę zwierząt.

1 użytkowników online, w tym zalogowanych: 0, gości: 1