As the name of this creational design pattern already shows dependencies are getting injected (as parameter) instead of creating them internally.
class IAudioControl {}; class AudioControl : public IAudioControl {}; class OfflineMediaPlayer { public: // Constructor without dependency injection OfflineMediaPlayer() { m_AudioControl = new AudioControl(); } ~OfflineMediaPlayer() { delete m_AudioControl; } private: IAudioControl* m_AudioControl; }; class OnlineMediaPlayer { public: // Constructor with dependency injection OnlineMediaPlayer(IAudioControl* audioControl) : m_AudioControl(audioControl) {} private: IAudioControl* m_AudioControl; }; int main() { { OfflineMediaPlayer offlineMediaPlayer; } { AudioControl audioControl; OnlineMediaPlayer onlineMediaPlayer(&audioControl); } return 0; }