C++ Templates und virtuelle Methoden
Verfasst: 04.08.2016, 20:32
Hallo Freunde der Sonne!
Ich habe eine Frage zum Thema C++/Templates/Vererbung. Ich ahne, dass ich mich später dafür schämen werde, sowas gebaut und dann noch gefragt zu haben, aber es lässt mir keine Ruhe:
Nun: Ich lese immer, dass "virtual" methods und Templates nicht zusammenpassen, da das eine zur Laufzeit stattfindet und das andere zur Compile-Time.
Jetzt habe ich folgendes Scenario (mal vereinfacht/etwas synthetisiert):
Ich definiere quasi im Basistemplate Methoden , die in der Implementierung des Basistemplates gecallt werden, aber erst im der ableitenden Template implementiert werden.
Wie gesagt lese ich immer (auch von Stroustrup persönlich), das virtuelle Methoden und Templates in Kombi sinnlos sind. Ich erkenne hier aber einen Sinn und es funktioniert auch.
Mein Code kompiliert mit MSVC und dem GCC gut und beides läuft geschmiert - wie es sein soll.
Nun meine Frage: Funktioniert es nur zufällig, weil der Kompiler dem Ganzen doch irgendeinen Sinn gibt, der ursprünglich nicht definiert ist?
Wenn mein Ansatz falsch ist, wie könnte ich es richtig machen?
Klar könnte ich "int getCount() const" in eine abstrakte Basisklasse (kein Template) ziehen, von der dann das Basis-Template TBaseCollection selbst ableitet. Aber was mache ich dann mit "const T& operator[] (int) const = 0;" , was ja typbezogen sein muss und daher Teil des Templates sein sollte.
Geht da was mit meinem Verständnis von "virtuelle Methoden" (Benutzung von schlüsselwortes virtual) und "abstrakten Methoden" (nicht impementiert: "void blah() = 0" ) schief? Wo ist mein Denk-/Designfehler? Wie geht es "richtiger"? *Confused*
Ich habe eine Frage zum Thema C++/Templates/Vererbung. Ich ahne, dass ich mich später dafür schämen werde, sowas gebaut und dann noch gefragt zu haben, aber es lässt mir keine Ruhe:
Nun: Ich lese immer, dass "virtual" methods und Templates nicht zusammenpassen, da das eine zur Laufzeit stattfindet und das andere zur Compile-Time.
Jetzt habe ich folgendes Scenario (mal vereinfacht/etwas synthetisiert):
Code: Alles auswählen
//definiere Template, welches als Basis-Klasse/Basis-Template für andere Templates gilt
template <typename T> class TBaseCollection {
public:
[...]
virtual int getCount () const = 0;
virtual const T& operator[] (int) const = 0;
void doConvinientAndCommonStuff() {
[do something here which is common for all collections]
int a = getCount(); // call virtual method defined here (to be implemented in derived template class)
[...]
}
};
// leite von Basistemplate ab und implementiere abstrakte/virtuelle Methoden
template <typename T> class TArray : public TBaseCollection<T> {
public:
int getCount () const {
return (10); // silly example, but does the job
}
const T& operator [](int Index) const {
return Items[Index]; // just return the simple item here without having boilerplate code here
}
private:
T m_Items[10]; // silly example with static content
};
Wie gesagt lese ich immer (auch von Stroustrup persönlich), das virtuelle Methoden und Templates in Kombi sinnlos sind. Ich erkenne hier aber einen Sinn und es funktioniert auch.
Mein Code kompiliert mit MSVC und dem GCC gut und beides läuft geschmiert - wie es sein soll.
Nun meine Frage: Funktioniert es nur zufällig, weil der Kompiler dem Ganzen doch irgendeinen Sinn gibt, der ursprünglich nicht definiert ist?
Wenn mein Ansatz falsch ist, wie könnte ich es richtig machen?
Klar könnte ich "int getCount() const" in eine abstrakte Basisklasse (kein Template) ziehen, von der dann das Basis-Template TBaseCollection selbst ableitet. Aber was mache ich dann mit "const T& operator[] (int) const = 0;" , was ja typbezogen sein muss und daher Teil des Templates sein sollte.
Geht da was mit meinem Verständnis von "virtuelle Methoden" (Benutzung von schlüsselwortes virtual) und "abstrakten Methoden" (nicht impementiert: "void blah() = 0" ) schief? Wo ist mein Denk-/Designfehler? Wie geht es "richtiger"? *Confused*