Multiple Inheritance from two derived classes

后端 未结 5 1248
清酒与你
清酒与你 2020-11-30 08:55

I have an abstract base class which acts as an interface.

I have two \"sets\" of derived classes, which implement half of the abstract class. ( one \"set\" defines t

相关标签:
5条回答
  • 2020-11-30 09:02

    It can be done, although it gives most the shivers.

    You need to use "virtual inheritance", the syntax for which is something like

    class AbsInit: public virtual AbsBase {...};
    class AbsWork: public virtual AbsBase {...};
    class NotAbsTotal: public AbsInit, public AbsWork {...};
    

    Then you have to specify which function you want to use:

    NotAbsTotal::work()
    {
        AbsInit::work_impl();
    }
    

    (UPDATED with correct syntax)

    0 讨论(0)
  • 2020-11-30 09:02

    You have to start thinking in the terms of what you are trying to model here.

    Public inheritance should only ever be used to model an "isa" relationship, e.g. a dog is a animal, a square is a shape, etc.

    Have a look at Scott Meyer's book Effective C++ for an excellent essay on what the various aspects of OO design should only ever be interpreted as.

    Edit: I forgot to say that while the answers so far provided are technically correct I don't think any of them address the issues of what you are trying to model and that is the crux of your problem!

    HTH

    cheers,

    Rob

    0 讨论(0)
  • 2020-11-30 09:18

    It looks like you want to do virtual inheritance. Whether that turns out to actually be a good idea is another question, but here's how you do it:

    
    class AbsBase {...};
    class AbsInit: public virtual AbsBase {...};
    class AbsWork: public virtual AbsBase {...};
    class NotAbsTotal: public AbsInit, public AbsWork {...};
    

    Basically, the default, non-virtual multiple inheritance will include a copy of each base class in the derived class, and includes all their methods. This is why you have two copies of AbsBase -- and the reason your method use is ambiguous is both sets of methods are loaded, so C++ has no way to know which copy to access!

    Virtual inheritance condenses all references to a virtual base class into one datastructure. This should make the methods from the base class unambiguous again. However, note: if there is additional data in the two intermediate classes, there may be some small additional runtime overhead, to enable the code to find the shared virtual base class.

    0 讨论(0)
  • 2020-11-30 09:18

    You need to to declare the inheritance as virtual:

    struct AbsBase {
              virtual void init() = 0;
              virtual void work() = 0;
    };
    
    struct AbsInit : virtual public AbsBase {
              void init() {  }
    };
    
    struct AbsWork : virtual public AbsBase {
              void work() { }
    };
    
    struct NotAbsTotal : virtual public AbsInit, virtual public AbsWork {
    };
    
    void f(NotAbsTotal *p)
    {
            p->init();
    }
    
    NotAbsTotal x;
    
    0 讨论(0)
  • 2020-11-30 09:22

    I found a good and simple example at the below link. The article explains with an example program for calculating the area and perimeter of a rectangle. You can check it..cheers

    Multilevel Inheritance is an inheritance hierarchy wherein one derived class inherits from multiple Base Classes. Read more..

    http://www.mobihackman.in/2013/09/multiple-inheritance-example.html

    0 讨论(0)
提交回复
热议问题