Problem z rzutowaniem typow

0

Cześć forum :P Otóż mam problem z nazwijmy to rzutowaniem. Sytuacja wygląda tak:

#include <iostream>
#include <string>

using namespace std;

class Ksiazka {
public:
    Ksiazka(string autor, string tytul)
    {
        this->autor = autor;
        this->tytul = tytul;
    }

    virtual void opis() { cout << autor + " " + tytul << endl; }
protected:
    string autor;
    string tytul;
};

class StaraKsiazka : public Ksiazka
{
public:
    StaraKsiazka(string autor, string tytul, int ilosckurzu) : Ksiazka(autor, tytul) {
        this->ilosckurzu = ilosckurzu;
    }

    void opis() { cout << autor + " " + tytul + ", ilosc kurzu: " + to_string(ilosckurzu) << endl; }
private:
    int ilosckurzu;
};

int main()
{
    StaraKsiazka ksiazka("Ksiazka", "XXX", 23);
    ksiazka.opis();

    Ksiazka* ksiazki = new Ksiazka[1]{ksiazka};
    ksiazki[0].opis();
}

Chodzi mi o to, że funkcja opis jest virtual, ale jednak finalnie nie zostaje nadpisana. Bo chce aby z tablicy obiektow Ksiazka po wywolaniu funkcji opis na którymś z obiektu wypisywało pełny opis jakby to był kompletny obiekt typu np. StaraKsiazka - czyli aby tez była ilosc kurzu wypisana. A tu mimo że ta książka była starą ksiązką, to drukuje opis jakby to była po prostu książka :D

Wyjście:

Ksiazka XXX, ilosc kurzu: 23
Ksiazka XXX
1
    Ksiazka* ksiazki = new Ksiazka[1]{ksiazka};
    ksiazki[0].opis();

Tutaj, ksiazki[0] jest konkretnego typu, Ksiazka, dlatego nie ma mowy o wirtualnym wywołaniu. Czym innym by było zrobienie

Ksiazka* ksiazka = new StaraKsiazka;
ksiazka->opis();

W szczególności, być może alokacja przez new jest tutaj przydatna, ale raczej w innym miejscu:

std::vector<Ksiazka*> ksiazki { new StaraKsiazka("Ksiazka", "XXX", 23) };
ksiazki[0]->opis();
1
#include <iostream>
#include <string>
using namespace std;

class Ksiazka {
public:
    Ksiazka(string autor, string tytul)
    {
        this->autor = autor;
        this->tytul = tytul;
    }

    virtual void opis() { cout << autor + " " + tytul << endl; }
protected:
    string autor;
    string tytul;
};

class StaraKsiazka : public Ksiazka
{
public:
    StaraKsiazka(string autor, string tytul, int ilosckurzu) : Ksiazka(autor, tytul) {
        this->ilosckurzu = ilosckurzu;
    }

    virtual void opis() { cout << autor + " " + tytul + ", ilosc kurzu: " << ilosckurzu << endl; }
private:
    int ilosckurzu;
};

int main()
{
    StaraKsiazka ksiazka1("Ksiazka stara", "XXX", 23);
    ksiazka1.opis();
    Ksiazka ksiazka2("Ksiazka nowa", "YYY");
    ksiazka2.opis();
    
    //Ksiazka* ksiazki = new Ksiazka[1]{ ksiazka /* tu użyto konstruktor kopiujący do kopiowania ze StaraKsiazka do  Ksiazka */ }; 

    Ksiazka *ksiazki[]={&ksiazka1,&ksiazka2};
    ksiazki[0]->opis();
    ksiazki[1]->opis();
   
    return 0;
}

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