Although you might need to have the same base class occur more than once, there are costs: there are multiple virtual table pointers and clients who want to cast to the base class that have to supply a casting path to indicate which of the duplicates the cast is for. If you don't need to cast back, and you don't need two copies of the data, this is one of the situations where virtual base classes might be better.