- Design proper abstraction (interfaces)
- Apply inheritance
- Fix encapsulation
- Use polymorphism to represent every type of car, using a single pointer
- Fix diamond problem
- Fix potential memory leaks
- Think about the way of keeping engines in cars. Should they be kept by a value, reference or a pointer (what kind of pointer)?
- Is this code testable?