#include <string>
#include <iostream>


using namespace std;

//klasa bazowa
class Record {
public:
    Record() {}
	virtual ~Recor() = default;
    virtual void save() = 0;

	bool isEmpty() const { return false; }
    bool isModified() const { return true; }
};

class FileRecord : public Record {
public:
    FileRecord(const std::string& filename) {
     //media preparation, details not required in this exercise!
 }

    void save() override {
        if( ! isEmpty() && isModified() ) {
         //saving implementation, details not required in this exercise!
         cout << "save record to file" << endl;
        }
    }
};

class StreamRecord : public Record {
public:
    StreamRecord(const std::string& stream_id)  {
     //media preparation, details not required in this exercise!
 }

    void save() override {
        if( ! isEmpty() && isModified() ) {
         //saving implementation, details not required in this exercise!
         cout << "save record to stream" << endl;
        }
    }
};


//NVI - klasa bazowa
class Record {
public:
    Record() {}
    virtual void save() {
        if( ! isEmpty() && isModified() ) {
            coreSave();
        }
    }

    bool isEmpty() const { return false; }
    bool isModified() const { return true; }
private:
    virtual void coreSave() = 0;
    int userId_;
};

class FileRecord : public Record {
public:
    FileRecord(const std::string& filename) {
        //media preparation, details not required in this exercise!
    }

    void coreSave() override {
            //saving implementation, details not required in this exercise!
        cout << "save record to file" << endl;
    }
};

class StreamRecord : public Record {
public:
    StreamRecord(const std::string& stream_id)  {
        //media preparation, details not required in this exercise!
    }

    void coreSave() override {
        //saving implementation, details not required in this exercise!
        cout << "save record to stream" << endl;
    }
};


int main() {
    static const int USER_ID = 1;
    FileRecord record1("filename.txt");
    StreamRecord record2("stream");

    record1.save();
    record2.save();
    return 0;
}
