Extending from two classes
Object-Oriented Design practice on Codemia
Turn requirements into classes, and defend the design, on the problems that come up in OOD rounds.
In object-oriented programming, inheritance is a fundamental concept that allows a class to inherit properties and behaviors (methods) from one or more classes. However, most programming languages, particularly those that emphasize object-oriented principles, adhere to "single inheritance," which restricts a class to inherit from only one parent class. This often raises interest and occasional debate around the idea of extending from two classes concurrently, commonly referred to as "multiple inheritance." This article delves into the technical intricacies, challenges, and solutions related to extending from two classes.
Understanding Single vs. Multiple Inheritance
Single Inheritance
Single inheritance allows a derived class to inherit from one base class. The primary benefit is its simplicity—it avoids the complex scenarios and potential ambiguity that may arise from multiple inheritance. Despite these advantages, it limits the level of reusability, as a class can only have one parent class, and thus may not be able to leverage functionalities from multiple sources.
Multiple Inheritance
Multiple inheritance enables a class to inherit properties and behaviors from more than one base class. While this increases code reuse and can lead to more flexible designs, it introduces challenges such as:
- Diamond Problem: A scenario where a single derived class inherits from two classes that each inherit from a common base class. This can lead to ambiguity in which parent's method/property is to be used.
- Conflict Resolution: Methods with the same name in multiple base classes can create conflicts that need to be resolved by the compiler or developer.
Below is a quick comparison of single and multiple inheritances:
| Feature | Single Inheritance | Multiple Inheritance |
| Simplicity | High | Lower |
| Code Reusability | Limited | Higher |
| Ambiguities | Rare | Possible (diamond problem) |
| Supported By Languages | Most OOP languages | Fewer, specific languages |
| Conflict Management | Minimal | Requires resolution |
Multiple Inheritance in Practice
Languages Supporting Multiple Inheritance
Some programming languages do support multiple inheritance, such as:
- C++: Allows multiple inheritance directly.
- Python: Offers multiple inheritance and uses a method resolution order (MRO) to handle the diamond problem.
Example in C++
Here's a simple example of multiple inheritance in C++:
In the above code, class C inherits from both A and B. Calling obj.print() would result in an ambiguity error since both base classes have a method named print. However, we can resolve this by specifying which class's print method to use via Class::MethodName.
Handling Multiple Inheritance in Python
Python uses a technique called the C3 Linearization (or MRO) to address multiple inheritance issues, such as the diamond problem. The MRO determines the order in which base classes are searched when executing a method.
Here, class D inherits from both B and C. The MRO ensures that the method from B is called first due to its position in the order.
Alternatives to Multiple Inheritance
Because of the complexities associated with multiple inheritance, many languages tend to avoid it, favoring alternatives such as:
- Interfaces/Protocols: Used in Java and Swift. While they don't provide implementation, they define a contract that classes can implement, promoting multiple behaviors.
- Mixins: Common in Ruby and Python, they allow the inclusion of methods from one class into multiple other classes.
- Composition: Instead of inheriting from multiple classes, you combine simple objects into more complex ones, which helps in structuring and layering functionalities.
Conclusion
While extending from two classes—or multiple inheritance—can offer powerful ways to reuse code and construct flexible architectures, it brings complexities that need careful handling. Each programming language tackles these complexities differently, with solutions like MRO and mixins. Ultimately, choosing between single and multiple inheritance—or even opting for alternatives—depends on the specific needs of a project and the tools (languages) at hand. This nuanced approach allows developers to harness the best of inheritance paradigms effectively.
Related reading
- Extending from two classes
- Failed Autowired of BuildProperties Spring Boot 2.1.5 eclipse
- Field required a bean of type that could not be found. error spring restful API using mongodb
- generic NOT constraint where T IEnumerable
- Generic return type upper bound - interface vs. class - surprisingly valid code
- Generics in C, using type of a variable as parameter
- Get all derived types of a type
- Get lengths of a list in a jinja2 template

OOD Fundamentals
Master object-oriented design from first principles, SOLID, design patterns, and classic interview problems with hands-on coding.
View the courseTrack what you have practised
A free account saves your progress, solutions and study plan across every problem on Codemia.
Object-Oriented Design practice on Codemia
Turn requirements into classes, and defend the design, on the problems that come up in OOD rounds.