Vererbte template-Funktion in abgeleiteter Klasse überschreiben?!
Mein Problem ist folgendes: Ich habe eine abstrakte Basisklasse, von welcher eine Klasse abgeleitet wird, welche wiederum als Basisklasse für eine weitere Ableitung dient.
Die "Zwischenklasse" bekommt zum einen per "normaler" Quellcode-Datei die Implementierung zu den abstrakten Funktionen, zum anderen per zusätzlicher Quellcode-Datei die Implementierung zu im header deklarierten zusätzlichen template- Funktionen.
Alle Funktionen zusammen werden dann an die letzte Klasse vererbt. Soweit funktioniert das auch alles.
Nun muss aber für die letzte Klasse die Implementierung einer der template-Funktionen der mittleren Klasse geändert werden.
Auf deutsch: Ich müsste die Funktion in der Klasse überschreiben. Das kann ich aber nicht, weil diese ja template-Funktionen sind und deshalb auch" virtual" nicht verwendet werden kann.
Gibt es irgendeine Möglichkeit, nicht alle Funktionen zu vererben oder die Implementierung anderweitig zu ändern?
Der Funktionsname darf sich übrigens nicht ändern und die Klassenabhängigkeit muss auch erhalten bleiben, weil im Quellcode des restlichen Programms die Basisklasse als Interface verwendet wird und je nach Anwendungsfall auch andere abgeleitete Klassen verwendet werden.
Hat jemand einen Rat für mich?
Grüße, kingkong
Die "Zwischenklasse" bekommt zum einen per "normaler" Quellcode-Datei die Implementierung zu den abstrakten Funktionen, zum anderen per zusätzlicher Quellcode-Datei die Implementierung zu im header deklarierten zusätzlichen template- Funktionen.
Alle Funktionen zusammen werden dann an die letzte Klasse vererbt. Soweit funktioniert das auch alles.
Nun muss aber für die letzte Klasse die Implementierung einer der template-Funktionen der mittleren Klasse geändert werden.
Auf deutsch: Ich müsste die Funktion in der Klasse überschreiben. Das kann ich aber nicht, weil diese ja template-Funktionen sind und deshalb auch" virtual" nicht verwendet werden kann.
Gibt es irgendeine Möglichkeit, nicht alle Funktionen zu vererben oder die Implementierung anderweitig zu ändern?
Der Funktionsname darf sich übrigens nicht ändern und die Klassenabhängigkeit muss auch erhalten bleiben, weil im Quellcode des restlichen Programms die Basisklasse als Interface verwendet wird und je nach Anwendungsfall auch andere abgeleitete Klassen verwendet werden.
Hat jemand einen Rat für mich?
Grüße, kingkong
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 147968
Url: https://administrator.de/contentid/147968
Ausgedruckt am: 22.11.2024 um 03:11 Uhr
5 Kommentare
Neuester Kommentar
Hi kingkong,
eine template-Funktion ist ja für den Compiler eigentlich nur eine Beschreibung,
wie eine echte Funktion zu generieren ist, wobei Datentypen(Rückgabewert, Parameterwerte)
erst während der Laufzeit festgelegt werden. Von daher ist eine template-Funktion quasi
schon eine Überladung.
Lies dir mal auf dieser Seite http://de.wikibooks.org/wiki/C%2B%2B-Programmierung/_Templates/_Funktio ...
den Abschnitt Spezialisierung durch. Eventuell kommst du damit weiter.
Gruß
Günni
eine template-Funktion ist ja für den Compiler eigentlich nur eine Beschreibung,
wie eine echte Funktion zu generieren ist, wobei Datentypen(Rückgabewert, Parameterwerte)
erst während der Laufzeit festgelegt werden. Von daher ist eine template-Funktion quasi
schon eine Überladung.
Lies dir mal auf dieser Seite http://de.wikibooks.org/wiki/C%2B%2B-Programmierung/_Templates/_Funktio ...
den Abschnitt Spezialisierung durch. Eventuell kommst du damit weiter.
Gruß
Günni
Hi kingkong,
erstmal zu deiner letzten Frage:
Ich habe vor einiger Zeit "meine Bibliothek" mal ausgemistet, besitze trotzdem noch
10 C/C++ Bücher, und über eine Möglichkeit, das Vererben von Funktionen zu verhindern,
bin ich nirgendwo drauf gestoßen.
Das andere Problem:
Kingkong!!, das läßt sich doch rausfinden: Programmieren und testen
Die Möglichkeit, unter C++, Funktionen/Operatoren zu überladen, basiert doch darauf, dass der Compiler sich anhand
unterschiedlicher Kontexte(sprich: Datentypen bei Rückgabewerten/Parametern) die passende Implementation überladener Funktionen
selber raussucht.
Siehe dazu mal meinen Beitrag Überladen von Funktionen und Operatoren in C plus plus
Hier wurde der Operator + zweimal überladen.
Analog dazu würde ich jetzt mal sagen, dass auch bei deiner abgeleiteten Klasse das Original sowie die Spezialisierung(Überladung)
genutzt werden können.
Gruß
Günni
erstmal zu deiner letzten Frage:
Ich habe vor einiger Zeit "meine Bibliothek" mal ausgemistet, besitze trotzdem noch
10 C/C++ Bücher, und über eine Möglichkeit, das Vererben von Funktionen zu verhindern,
bin ich nirgendwo drauf gestoßen.
Das andere Problem:
Nun weiß ich aber nicht, ob ich so eine template-Spezialisierung auch in einer abgeleiteten
Klasse durchführen kann.
Kingkong!!, das läßt sich doch rausfinden: Programmieren und testen
Denn die "Zwischenklasse", also die, die die template-Funktionen implementiert, muss weiterhin
die nicht geänderte template-Funktion benutzen - und das auch für genau die Datentypen, die
(wenn es denn geht) in durch die Spezialisierung in der "untersten" Klasse besondere Aufmerksamkeit bekämen.
Die Möglichkeit, unter C++, Funktionen/Operatoren zu überladen, basiert doch darauf, dass der Compiler sich anhand
unterschiedlicher Kontexte(sprich: Datentypen bei Rückgabewerten/Parametern) die passende Implementation überladener Funktionen
selber raussucht.
Siehe dazu mal meinen Beitrag Überladen von Funktionen und Operatoren in C plus plus
Hier wurde der Operator + zweimal überladen.
Analog dazu würde ich jetzt mal sagen, dass auch bei deiner abgeleiteten Klasse das Original sowie die Spezialisierung(Überladung)
genutzt werden können.
Gruß
Günni