QuestObjects are helpless themselves. All game interactions with any QuestObject exist because of its Controller. The class validates user's interactions which directly related to the current QuestObject and changes the game. It knows what objects must be changed and how. Also he asks its QuestObject what is exactly required to proceed those changes. He doesn't care what kind of QuestObject it works with.


Implementation in code

Controller takes its QuestObject through template<typename object&> construction and validates user's behavior according to requirements of the QuestObject.

Visual interpretation of any Object

class QuestObject
{
private:
    QuestDialogue dialogue;
    
    bool triggeredFlag = false;

public:
    virtual ~QuestObject() = 0;

	  void          setDialogue();
    QuestDialogue getDialogue();
};

Source

QuestObject.h QuestObject.cpp