Mehrfachvererbung



  • Hallo!
    Ich habe ein Verständnisproblem, was Mehrfachvererbung angeht.

    Gegeben sind Interfaces, die folgende Vererbung aufweisen und nicht geändert werden können.

    InterfaceB -> InterfaceA
    InterfaceC -> InterfaceA
    InterfaceD -> InterfaceB -> InterfaceA

    KlasseE -> InterfaceB
    KlasseF -> InterfaceD

    Da jetzt InterfaceA in jeder Klasse implementiert werden muss, hätte ich gerne eine Implementierung von InterfaceA in KlasseA, also
    KlasseA -> InterfaceA

    Jetzt hab ich aber das Problem, dass bei KlasseE das InterfaceB implementieren muss, aber der geerbte Teil von InterfaceA aus KlasseA stammen soll.

    class KlasseE:
    {
    	public  KlasseA, 
    	virtual public InterfaceB
    
    //hier sind die Funktionen von KlasseA/InterfaceA nicht aufgeführt
    }
    

    Jetzt bekomme ich vom Compiler die Nachricht, dass ein Objekt von KlasseE nicht erzeugt werden kann, da dieses abstrakt ist.

    class KlasseA: public InterfaceA
    {
    public:
    	KlasseA();
    	virtual ~KlasseA();
    
    	virtual void fun1() override final ;
    	virtual void fun2() override final;
    }
    

    Wie löst man sowas elegant?

    Danke schon mal im Voraus
    Joe



  • Komplette Fehlermeldung Copy&Paste.
    Echter Code Copy&Paste.



  • Hier echter Code:

    int main()
    {
    	KlasseE *e = new KlasseE();
    }
    

    erzeugt:
    error C2259: "KlasseE": Instanz von abstrakter Klasse kann nicht erstellt werden
    "void InterfaceA::funA(void)": ist abstrakt

    class InterfaceA
    {
    	virtual void funA() = 0;
    };
    class InterfaceB:
    	public InterfaceA
    {
    	virtual void funB() = 0;
    };
    class KlasseA:
    	public InterfaceA
    {
    public:
    	KlasseA();
    	~KlasseA();
    
    	void funA() final override;
    };
    
    //Implementierung:
    KlasseA::KlasseA(){}
    KlasseA::~KlasseA(){}
    void KlasseA::funA(){}
    
    
    class KlasseE:
    	public InterfaceB
    {
    public:
    	KlasseE();
    	~KlasseE();
    
    	void funB() override;
    };
    //Implementierung:
    KlasseE::KlasseE(){}
    KlasseE::~KlasseE(){}
    void KlasseE::funB(){}
    
    

    Joe



  • Hallo,
    hab ich was übersehen? Was ist mit InterfaceA::funA()?



  • @helmut-jakoby sagte in Mehrfachvererbung:

    Was ist mit InterfaceA::funA()

    Das wird in KlasseA implementiert.Jedoch leitet auch InterfaceB von InterfaceA ab, das ist ja das Problem.



  • @joerider
    Zum Verständnis:
    Wenn InterfaceB von KlasseA abgeleitet werden würde, wäre alles gut?
    Aber das geht nicht, weil du das nicht ändern kannst?
    Richtig?



  • @jockelx sagte in Mehrfachvererbung:

    Wenn InterfaceB von KlasseA abgeleitet werden würde, wäre alles gut?

    Genau so ist es. Leider. Und der Code für InterfaceA ist immer derselbe.



  • Kannst du denn KlasseE ändern (denn irgendwo mußt du ja KlasseAeinfügen)?
    Denn

    class KlasseE : public KlasseA
    

    sowie

    class KlasseA : public InterfaceB // <- nicht InterfaceA!
    

    kompilieren, s.a. Ideone-Code.



  • Klassen kann ich alle ändern, jedoch müsste ich jetzt in KlasseA das Interface von InterfaceB implementieren. Es gibt jedoch auch noch andere Klassen, die "nur" InterfaceA benötigen und von anderen Interfaces abgeleitet werden, die im Endeffekt wieder bei InterfaceA landen.

    InterfaceB -> InterfaceA
    InterfaceC -> InterfaceA
    InterfaceD -> InterfaceB -> InterfaceA



  • Nein, ich meine, daß die KlasseA abstrakt bleibt (und nur die von dieser Klasse erbende dann InterfaceB implementiert - außer es gibt eine Default-Implementierung dafür).
    Und dann entweder andere Klassen für InterfaceC, InterfaceD etc. einführen oder aber KlasseA erbt von allen Interfaces, s. geänderter Ideone-Code.

    Ohne Änderung der Interfaces bzgl. : virtual public InterfaceA wirst du sonst diese Mehrfachvererbung nicht auflösen können.



  • Dieser Beitrag wurde gelöscht!