This is the kind of functionality I want: to be able to access data of derived Subsystem classes from any class that has a reference to the Context (ideally 1 pointer for each type of derived class).
It appears I'll have to do some pointer casting. Am I doing it wrong?
So poking around I find that the deallocation will be fine, but if I want to ensure the destructor for the derived class is called, I need the base class to have its destructor declared as virtual.
Your pointer casting is due to the fact that you are upcasting, meaning you want a pointer of a more specialized class out of a pointer of a more basic class. In these cases, you should use dynamic_cast<> instead of C-style casting, provided you are compiling with RTTI enabled.