#include <string>
#include <memory>

//implementacja nieistotna
class Image { };

class Item {
public:
    Item(const std::string& n) : name(n) {
        image = new Image();
    }
    Item(Item&& src) : name(src.name) {
        image = src.image;
        src.image = nullptr;
    }
    virtual ~Item() {
        delete image;
    }
private:
    Item(const Item&) = delete;
    Item& operator=(const Item&) = delete;
    Item& operator=(Item&&) = delete;

    std::string name;
    Image* image;
};

class Book : public Item {
public:
 Book(const std::string& n) : Item(n) {
     front = new Image();
     back = new Image();
 }

 ~Book() {
     delete back;
     delete front;
 }
private:
    Image* front;
    Image* back;
};



class Item {
public:
    Item(const std::string& n) : name(n), image(new Image) { }

    Item(Item&& src) = default;
    virtual ~Item() = default;
private:
    Item(const Item&) = delete;
    Item& operator=(const Item&) = delete;
    Item& operator=(Item&&) = delete;

    std::string name;
    std::unique_ptr<Image> image;
};

class Book : public Item {
public:
    Book(const std::string& n) : Item(n), front(new Image), back(new Image) {
    }
    Book(Book&& src) = default;
    ~Book() = default;
private:
    std::unique_ptr<Image> front;
    std::unique_ptr<Image> back;
};



int main() {
    Book b("c++17");
    Book c = Book("c++20");
    return 0;
}
