When might multiple inheritance be the only reason

2020-06-12 04:28发布

To be clear, I'm not asking if/why multiple inheritance is good or bad. I've heard a lot of arguments from both sides of that debate.

I'm wondering if there is any kind of design problem or scenario in C++ in which multiple inheritance is either the only way to accomplish something, or at least is the most optimal way over all other alternatives to the point that it wouldn't make sense to consider anything else.

Obviously, this question doesn't apply to languages that don't support multiple inheritance.

10条回答
等我变得足够好
2楼-- · 2020-06-12 04:31

When you must combine two or more third-party class hierarchies, each of which requires that objects be derived from the hierarchy's own Base class, then lacking multiple inheritance will make your code complex and fiddly.

namespace Object_Database {
    class Object {
      public:
        virtual void store() ;
        virtual void fetch() ;
    };
}

namespace Reflectives {
    class Object {
      public:
        virtual std::vector<std::string> > membernames();
        virtual std::vector<std::string> > methodnames();
    };
}

The first hierarchy lets users create objects which can be serialized to and from an object database, and requires that all such objects be derived from class Object_Database::Object. The second hierarchy lets users create objects which can be queried at runtime for the names of their members, and requires that all such objects be derived from Reflectives::Object.

If you require objects that can do both, you just need to write:

  class ReflectivePickle : 
  public Object_Database::Object, 
  public Reflectives::Object {
    // ...
  };

The other solutions are unreasonable.

查看更多
成全新的幸福
3楼-- · 2020-06-12 04:32

If you want to see a beautiful implementation of Multiple Inheritance check out Eiffel. They solve the diamond problem through feature renaming, far simpler than scope resolution and it even supports direct repeated inheritance such that:

A inherit B, B, B

when the need arises to use this type of inheritance.

Their Kernel library is open source and multiple inheritance is used extensively if you would like to see examples.

http://sourceforge.net/projects/eiffelstudio/files/

查看更多
闹够了就滚
4楼-- · 2020-06-12 04:34

Multiple inheritance is useful if you need to inherit behavior, not just contract. However, as other languages demonstrate, multiple inheritance is not the only way to solve that problem, at the expense of making your inheritance tree deeper. As such, scenarios where you must and may only use multiple inheritance would be pretty rare.

查看更多
小情绪 Triste *
5楼-- · 2020-06-12 04:34

When you want to inherit functionality rather than role, case in point boost::noncopyable (other languages that support this (unlike Java and C#) call this a mixin).

查看更多
别忘想泡老子
6楼-- · 2020-06-12 04:40

I tend to use multiple inheritance in C++ when the base classes are "interface classes", i.e. base classes where all methods are pure virtual, none have implementations [remember you can still define an implementation, but you have to invoke it explicitly], and there are no data members. Very similar to "interfaces" in Java or (from what I hear) C#.

To use polymorphism in C++, you can't use composition, you have to use (public) inheritance.

So if class Bar inherits (publicly) from Printable and Serializable, I can treat the object like a printable object, a serializable object, or a Bar object (using pointers or references).

With composition, you can't do that.

查看更多
乱世女痞
7楼-- · 2020-06-12 04:41

I'd read up on Java Interfaces, and so on, to get a better idea as to the answer to this question. The idea behind an Interface is to create an abstract class that acts as a template for another class. the advantage, here, is that the templates can be combined within a concrete class. For example-

Parent class- FoodStore Subclass- CoffeeShop Subclass- Bakery

With this inheritance tree, a FoodStore can be a Bakery or a CoffeeShop but not both. But then what would we call a Starbucks?

Better way, IMO-

Parent Class- FoodStore Interface- CoffeeShop Interface- Bakery

public class Starbucks extends FoodStore implements CoffeeShop, Bakery { ... }

You'll have to know a bit of Java to understand that, but have at it. Interfaces are fairly elementary, IMO.

As a further musing, perhaps Interfaces are designed to obey "Don't repeat yourself." Obvious, now that I mention it.

查看更多
登录 后发表回答