#include <vector>
#include <string>
#include <iostream>


using namespace std;

//klasa bazowa
class DigitalMedia {
public:
    DigitalMedia(int userId) : userId_(userId) {}
    virtual void play(const string& name) const = 0;

    bool checkCredentials() const { return true; }
private:
    int userId_;
};

class VideoDigitalMedia : public DigitalMedia {
public:
    VideoDigitalMedia(int userId) : DigitalMedia(userId) {}

    void play(const string& name) const {
        if( checkCredentials() ) {
            cout << "video play: \"" << name << "\"" << endl;
        }
    }
};

class AudioDigitalMedia : public DigitalMedia {
public:
    AudioDigitalMedia(int userId) : DigitalMedia(userId) {}

    void play(const string& name) const {
        if( checkCredentials() ) {
            cout << "audio play: \"" << name << "\"" << endl;
        }
    }
};

class TextDigitalMedia : public DigitalMedia {
public:
    TextDigitalMedia(int userId) : DigitalMedia(userId) {}

    void play(const string& name) const {
        if( checkCredentials() ) {
            cout << "text play: \"" << name << "\"" << endl;
        }
    }
};


//NVI - klasa bazowa
class DigitalMedia {
public:
    DigitalMedia(int userId) : userId_(userId) {}
    void play(const string& name) const {
        if(checkCredentials() ) {
            doPlay(name);
        }
 }
private:
    bool checkCredentials() const { return true; }
    virtual void doPlay(const string& name) const = 0;
    int userId_;
};

class VideoDigitalMedia : public DigitalMedia {
public:
    VideoDigitalMedia(int userId) : DigitalMedia(userId) {}
private:
    virtual void doPlay(const string& name) const {
        cout << "video play: \"" << name << "\"" << endl;
    }
};


class AudioDigitalMedia : public DigitalMedia {
public:
    AudioDigitalMedia(int userId) : DigitalMedia(userId) {}
private:
    virtual void doPlay(const string& name) const {
        cout << "audio play: \"" << name << "\"" << endl;
    }
};


class TextDigitalMedia : public DigitalMedia {
public:
    TextDigitalMedia(int userId) : DigitalMedia(userId) {}
private:
    virtual void doPlay(const string& name) const {
        cout << "text play: \"" << name << "\"" << endl;
    }
};

void playMedia(const DigitalMedia& dm) {
    dm.play("Pan Tadeusz");
}

int main() {
    static const int USER_ID = 1;
    VideoDigitalMedia player1(USER_ID);
    AudioDigitalMedia player2(USER_ID);
    TextDigitalMedia player3(USER_ID);

    playMedia(player1);
    playMedia(player2);
    playMedia(player3);
    return 0;
}
