polymorphie example
-
Hi,
macht folgendes beispiel am besten geeignet um polymorphie zu erklären/zeigen?
enum class_type { Derived_Class1, Derived_class2 }; class Base { virtual class_type get_type_info() = 0; }; class Derived1 : public Base { public: class_type get_type_info() { return Derived_Class1; } }; class Derived2 : public Base { public: class_type get_type_info() { return Derived_class2; } }; int main() { Base *ptr1 = new Derived1; Base *ptr2 = new Derived2; if(ptr1->get_type_info() == Derived_Class1) { cout << "object is of type Derived_Class1" << endl; } if(ptr2->get_type_info() == Derived_Class2) { cout << "object is of type Derived_Class2" << endl; } }
-
Geri1 schrieb:
Hi,
macht folgendes beispiel am besten geeignet um polymorphie zu erklären/zeigen?
Nein. Ein realistisches beispiel ist besser.
-
Außerdem ist das eigentlich genau das gegenteil von dem wie man polymorphie verwendet.
-
bitte um ein realistisches beispiel!
-
Wenn ich Polymorphie erklären müsste, würde ich wohl so etwas nehmen: https://ideone.com/vfdPzm
#include <iostream> #include <memory> #include <random> #include <vector> class Base { public: virtual void foo() = 0; virtual ~Base() {} }; class DerivedA : public Base { public: virtual void foo() { std::cout << "Hello from DerivedA!\n"; } }; class DerivedB : public Base { public: virtual void foo() { std::cout << "Hello from DerivedB!\n"; } }; int main() { std::vector<std::unique_ptr<Base>> bases; std::default_random_engine e(3765928); std::uniform_int_distribution<> d(0, 1); for (std::size_t i = 100; i-- != 0; ) { if (d(e)) bases.push_back(std::unique_ptr<DerivedA>(new DerivedA)); else bases.push_back(std::unique_ptr<DerivedB>(new DerivedB)); } for (auto i = bases.begin(); i != bases.end(); ++i) (*i)->foo(); }
Das macht gleich den wichtigsten Aspekt klar: Man kann das Verhalten einer Funktion ändern. Es demonstriert "pure virtual", dass man Pointer braucht um das alles in einen Container stopfen zu können, und dass man mit dieser Methode die Typen zur Laufzeit festlegen kann. (An dieser Stelle kann man den Unterschied zu Templates und CRTP erklären.)
-
Vielleicht etwas in der Art von Verktormalprogrammen: Ein Grafikobjekt als Basisklasse mit rein virtuellen Funktioen wie z.B. zeichnen, abgeleitet sind z.B. Ovale und Rechtecke. Diese wissen wiederum wie sie zu zeichnen sind...
-
Templates aka compile time polymorphie?
was ist CRTP?
-