====== Generisches Programmieren ====== ===== Statische Polymorphie ===== Nach dem bisherigen Kenntnisstand verstehen wir unter Polymorphie folgendes: #include // Basisklasse class Basis { public: virtual void foo() { std::cout << "Basis foo" << std::endl; } }; void call_foo(Basis* obj) { obj->foo(); } // Ableitung von der Basis class Bar : public Basis { public: void foo() { std::cout << "Bar foo" << std::endl; } }; // Ableitung von der Basis class Doe : public Basis { public: void foo() { std::cout << "Doe foo" << std::endl; } }; // Testprogramm int main(int argc, char* argv[]) { Bar b; Doe c; // Basis "verhält" sich wie "Bar" call_foo(&b); // Ausgabe: Bar foo // Basis "verhält" sich wie "Doe" call_foo(&c); // Ausgabe Doe foo return 0; } Die Auswahl der aufzurufenden Funktion erfolgt durch "spätes Binden" (late binding) [FIXME Verweis auf Kapitel Polymorphie]. Das obige Beispiel kann man auch über Templates realisieren. #include // Funktionstemplate template void call_foo(const type& curObj) { curObj.foo(); } class Bar { public: void foo() { std::cout << "Bar Foo" << std::endl; } }; class Doe { public: void foo() { std::cout << "Doe Foo" << std::endl; } }; int main(int argc, char* argv[]) { Bar b; Doe d; // rufe konkrete Template-Funktion mit richtigem Typ auf call_foo(b); // Ausgabe: Bar Foo call_foo(d); // Ausgabe: Doe Foo return 0; } Was passiert hier? Wir definieren zunächst ein Funktionstemplate mit dem Namen call_foo. template void foo(const type& curObj) { // .... } Dieses ist für den Compiler eine Vorlage zum generieren der Funktion. Trifft der Compiler beim übersetzen des Programms auf einen Aufruf, zu einer Funktion mit dem konkreten Typ. Für folgendes Codestück Bar b; call_foo(b); kann man sich also vorstellen, dass der Compiler eine Funktion void call_foo(const Bar& curObj); erzeugt. Die Abhängigkeit wir also zur Kompilierzeit aufgelöst. Wenn der Compiler eine template Funktion sieht, wird er versuchen sie zu inlinen, sprich anstatt des Funktionsaufruf wird er den in der template Funktion verwendeten Code an der Aufrufstelle einsetzen und übersetzen. [[http://forum.proggen.org/viewtopic.php?f=39&t=780|Diskussion]]