I'm starting a new thread because I'm beginning to think that I was way overthinking several inheritance aspects that the compiler takes care of (the guy who said I'd get a compiler error in certain dangerous cases was absolutely right).
Here's my attempt to get back to an overview of the important things:
1) If your class is going to be a base class, just routinely define your destructor as virtual.
2) Be sure actually to destroy everything as necessary if you use dynamic memory allocation in the constructors.
3) There are a few syntactical things to remember in certain cases (often constructors and assignment operator) due to the fact that you can't directly access the private members of your base class. But here we're really just dealing with finding language to get the base class members assigned properly.
4) Declare as virtual other functions in your base class that will need to be redefined in some derived classes.
Pretty much everything else seems to me to follow from the "is-a" relationship. So, if that relationship is right, things should normally work. The "difficulties" here are really more syntactical than substantive (in the sense that you're doing anything dangerous to memory).
Does that sound about right?