There are two philosophies when it comes to class variables and things like this.
1) Static globals
In your main.cpp, NOT IN THE HEADER FILE, create an instance of your class. Then anywhere it is needed tell the compiler it exists as a static global.
so in main.cpp
SoundManager * soundManager;
soundManager = new SoundManager();
And anywhere else it is needed ...
extern SoundManager * soundManager;
void Child::PlaySoundEffect(int id)
This is clean and simple, but it offends the purists. In some OS's it is also illegal. Symbian only allows a single global variable for apps which has to be accessed through a special mechanism.
2) Pointer passing
The sound manager will be created in a class, not as a global. Whenever you know that you will need to use the sound manager in a child class, you
have to pass the class variable down to the child class at some point, usually when you create the child class.
Child * child;
child = new Child(soundManager);
This can be a pain in the \ when you get your class design wrong and realise you need to see a class instance from somewhere that cannot see the class.
A half way house solution is to wrap all your class instances up in a single class and pass that to everything by default.