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 -> InterfaceAKlasseE -> InterfaceB
KlasseF -> InterfaceDDa jetzt InterfaceA in jeder Klasse implementiert werden muss, hätte ich gerne eine Implementierung von InterfaceA in KlasseA, also
KlasseA -> InterfaceAJetzt 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 abstraktclass 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 jaKlasseA
einfügen)?
Dennclass 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 dannInterfaceB
implementiert - außer es gibt eine Default-Implementierung dafür).
Und dann entweder andere Klassen fürInterfaceC
,InterfaceD
etc. einführen oder aberKlasseA
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!