What we would like from any module-based approach:
Reduce conceptual load by minimizing the level of detail needed at any one point
Fault containment, so that programmers don't misuse a component, and limiting where a component might be used
Independence: it would be nice to be able to be agnostic with respect to the actual implementation; if we later change out one implementation for another, then it should not have any evident impact on code using the module
class person { ...
class student : public person { ...
class professor : public person { ...
student s;
professor p;
person *x = &s;
person *y = &p;
x->print_classes();
y->print_classes();