Merhfachableitung und Vererbung von virtuellen Methoden
-
Hallo,
folgende Sache verstehe ich nicht komplett und hätte gerne eine Lösung. Momentan löse ich es mit explizitem Weiterleiten an die Klasse B. (B::Methode1())
class B{ public: virtual int Methode1(); //oder ohne virtual }; class C{ //Interface public: virtual int Methode1() = 0; virtual int Methode2() = 0; }; class A : public B, public C{ public: virtual int Methode1() {B::Methode1();} // möchte ich mir sparen virtual int Methode2(); };Den Aufbau noch mal in Worten beschrieben.
Ich habe eine Basisklasse B mit adminsitrativer Grundfunktionalität, der auch anderswo gebraucht wird. Von der erbt Klasse A und ergänzt eigenen Kram. Die Klasse A ist die eigentlich wichtige Doing-Klasse.Jetzt definierte ich ein Interface C mit der Klasse A in abstracter Form benutzt wird. Es handelt sich um Teilfunktionalitäten und dort, wo C benutzt wird, möchte ich A gar nicht bekannt machen.
Jetzt ist es aber so, dass ein Teil der Interface-Methoden von C, die A implementieren müsste, schon in der Basis B implementiert ist. Ist halt allgemeinerer Kram.Lasse ich den Forward weg, kommt bei VC++ sinngemäß dass kein Überschreiber vorhanden ist. Der Compiler hat zwar Recht, es ist keine Methode in A direkt, aber eben ererbt von B. Kann man das irgendwie realiseren, oder muss ich es wie oben explizit machen?
Gruß Thomas
Gruß Thomas
-
Kann B nicht direkt das Interface C anbieten?
-
Entweder wie Nathan geschrieben hat, oder lass die Weiterleitung drin, die ist völlig in Ordnung.
-
Nathan schrieb:
Kann B nicht direkt das Interface C anbieten?
Nicht wirklich. Erfundenes Beispiel:
B ist eine Person mit Eigenschaften wie Name, Alter usw.
A ist ein Facharbeiter, der zusätzlich zur Person halt Werkzeuge beherrscht, Tätigkeiten ausführt usw.C ist jetzt ein Interface für Firmen-Entity, wo es Angestellte, Maschinen, Immobilien etc. gibt. Da ist nur von Belang was und wie es heisst. Also z.B. aus einem Namen besteht und einer Tätikeit. Name kommt schon von B und Tätigkeit von A.
C ist sozusagen ein "Querinterface".
-
Wenn C so ein "Querinterface" ist, ist es dann nicht recht unüblich/selten dass die Signaturen & Semantik der Funktionen genau übereinstimmen?
-
Edit:
Ich sollte besser lesen.Dann ist es die Aufgabe von der Klasse welche von dem Interface erbt, die Funktionen zu überschreiben, also hast es mMn. schon richtig gemacht.
Edit:
Das hier habe auch mal gesehen:#define B_IMPL \ public: \ virtual int Methode1() \ { \ } \ class C{ //Interface public: virtual int Methode1() = 0; virtual int Methode2() = 0; }; class A : public C{ public: virtual int Methode2() {} B_IMPL };Debuggen macht so aber keinen Spaß.
-
sorry, ich bin in meinem Buch wohl noch nicht soweit, aber was bedeutet das hier ?
virtual int Methode1() = 0;wird hier ne Methode initialiesiert ? Unter was kann ich das nachlesen ?
-
Abstrakte (oder "pure virtual") Methode
-