funktionsdefinition in abgeleiteter Klasse erzwingen..
-
Hi Leuts, folgendes Problem:
Ich habe eine Basisklasse A von der ich verschiedene andere Klassen (B, C, und D) ableite. Die Basisklasse wird als Objekt niemals auftauchen.
Es handelt sich dabei um Messgeräte, die über eine serielle Schnittstelle mit meiner Software kommunizieren. Alle Geräte können so ziemlich das gleiche, aber sie haben andere Kommandostrings. Deshalb habe ich diese Struktur aufgebaut. Nun gibts ein paar Befehle, die auf verschiedenen Geräten aber doch identisch sind. Die definiere ich dann in der Basisklasse, und brauch mich bei bestimmten abgeleiteten Klassen also nicht mehr darum zu kümmern, die Funktion zu implementieren. Diese Funktionen habe ich also virtuell gemacht, funktioniert auch soweit.
Nun möchte ich aber erzwingen, dass eine bestimmte Funktion in JEDER Klasse definiert wird (Funktion A). Wie mache ich das ?
Mein erster Versuch war folgender: Ich habe im Headerfile der Basisklasse eine weitere Funktion virtuell deklariert. Nun meckert aber der Compiler schon dass die Funktion nicht definiert wurde. Wenn ich sie aber definiere und dann vergesse sie in der abgeleiteten Klasse zu überschreiben, dann wird ja die Definition der Basisklasse aufgerufen. Das will ich aber nicht!
Wie geht man da vor ?
-
Thule schrieb:
Diese Funktionen habe ich also virtuell gemacht, funktioniert auch soweit.
virtuell ist hier unnötig.
Thule schrieb:
Wie geht man da vor ?
Deklariere die Funktion rein virtuell. Eine rein virtuelle Funktion muss keine Definition besitzen, es sei denn, diese wird irgendwann mal Aufgerufen.
struct base { virtual void foo() = 0; }; struct derived1 : base {}; derived1 x; // Fehler, derived1 besitz eine rein virtuelle Funktion und ist daher abstrakt. struct derived2 : base { void foo() {} }; derived2 y; // ok, foo wurde überschrieben
-
Du machst am besten die Basisklasse abstrakt (kann nicht erzeugt werden).
struct base { virtual void foo () { std::cout << "hmm"; } virtual void bar () = 0; // muss implementiert werden virtual ~base (){} // virtueller destruktor ist wichtig }; int main () { base b; // fehler }Das nächste mal auch bitte mit Beispielcode, denn dann versteht man besser, was du willst.
-
ja das ging aber flott;
Ok, das "=0" hat bei mir gefehlt, Problem gelöst.
1000Dank