Search code examples
c++inheritancepolymorphismmultiple-inheritancemixins

Multiple inheritance, inheriting an interface and an implementation


Is it possible inherit both an interface and an implementation mixin in the same class? Something like this:

class Interface
{
public:
    virtual void method()=0;
};

class Component
{
public:
    void method(){ /*do something*/};
};

class MyClass : public Interface, public Component
{};

...
...
Interface* p = new MyClass(); p.method();

The idea being that the pure virtual function inherited from Interface is implemented in MyClass through its inheritance of Component. This doesn't compile; I need to to do this:

class MyClass : public Interface, public Component
{
 public:
    void method(){Component::method();} override
 };

Is it possible to somehow avoid the explicit override and delegation to Component, perhaps by using templates somehow?


Solution

  • If you want to avoid the explicit override and delegation to the component, there is no way around inheriting some kind of Interface-derived class that does this binding, because what you want to call ahas to end up in your derived class's vtable.

    I guess you could make it work with a diamond-like inheritance structure and virtual inheritance, but it's not exactly pretty:

    class Interface
    {
    public:
        virtual void method()=0;
    };
    
    class Component: virtual public Interface
    {
    public:
        virtual void method(){ /*do something*/};
    };
    
    
    class MyClass : virtual public Interface, private Component
    {
    public:
        using Component::method;
    };
    

    Usual disclaimer: virtual inheritance is expensive

    I have tried to find something better using templates, but I don't think there's a way to bind the component method to the virtual method without having having either the component inherit from the interface, or having to write binding code by hand.