Templates und Vererbung
-
Hallo!
Ich habe ein Template implementiert. Dieses Definiert eine Funktion function(int i) sowie eine Funktion function(int i, int a). Die Variante mit einem Parameter ist ausprogrammiert, die mit 2 Parametern ist abstrake.
Nun erbt ein anderes Template und definiert auch noch die 2. Variante der Funktion function.
Wenn ich nun der Template "Sub" instanziere und die Variante von function mit nur einem Parameter aufrufen will sagt mir der Compiler, dass diese Funktion nicht "1 Parameter akzeptiert". Aber es müsste doch die einparametrige Version geerbt werden!?
Nochmal um das zu verdeutlichen:
template <class T> class Base{ public: void function(int i){ } virtual void function(int i, int a) = 0; }; template <class T> class Sub : public Base<T>{ public: void function(int i, int a){ } }; int _tmain(int argc, _TCHAR* argv[]) { Sub<int> s; s.function(1); // <---- Fehler: Funktion akzeptiert keine 1 Argumente return 0; }
Habe ich einen Fehler gemacht oder verhält sich Overloading bei Templates anders?
Danke!
mfg
-
mal ne frage..
was ist _tmain() für ne function?
bisher dachte iches gäb main() für alles ausser WIn32 Prgs da wärs WinMain()
kann mir jemand das erklären?
ansonste..deine frage kan ich leider nich beantworten da ich zu wenig selber
templates sprogge
-
hi,
ich hab jetzt mit dem Code ein paar Sachen probiert: Es kommt genau der selbe Fehler, wenn man keine Templates verwendet. Der Fehler verschwindet erst, wenn man die rein virtuelle Funktion weglässt oder nicht (rein) virtuell macht.
[edit: Kann man (rein) virtuelle Funktionen nicht mit anderen Parametern überladen?]
Aber kA warum... erscheint mir auch net logisch.
-
ich glaube, wenn man in der abgeleiteten Klasse eine Fumktion der Basis überschreibt, auch wenn sie eine andere Anzahl Parameter hat, existiert die alte nicht mehr in der abgeleiteten Klasse. Es gab da son Schlüsselwort, mit der man die alte Funktion noch übernehmen mit übernehemn kann... könnte sowas wie using base::funkt(int a) sein... aber dsa sieht mir komisch aus... muss ma bisel rumprobieren. Du must jedenfalls kenntlich machen, dass du die alte Funktion noch mi verwenden möchstest
-
Die abgeleitene Klasse überdeckt die Methode der Basisklasse, da sie in einem anderen Scope ist.
Daher musst du entweder dem Compiler es explizit beim Aufruf sagen, mittels:
s.Base<int>::function(1);
Oder du nimmst eine using-Deklaration in der abgeleitenen Klasse:
using Base<T>::function;
Somit existiert function(int) auch in der abgeleitenen Klasse.
Edit:
Mir ist gerade eingefallen, dass HumeSikkins darüber einen guten FAQ Beitrag auf seiner Homepage hat.
Link: http://fara.cs.uni-potsdam.de/~kaufmann/?page=GenCppFaqs&faq=oho#Answ
Die Page scheint momentan nicht erreichbar zu sein, versuche es evtl. mit der Cache Funktion von Google.
-
ChrisR schrieb:
template <class T> class Base{ public: void function(int i){ } virtual void function(int i, int a) = 0 {} // <-- Weil keine .cpp datei mit Templates. }; template <class T> class Sub : public Base<T>{ public: void function(int i, int a){ } }; int _tmain(int argc, _TCHAR* argv[]) { Sub<int> s; s.function(1); // <---- Fehler: Funktion akzeptiert keine 1 Argumente return 0; }