Industrielle Fertigung
Industrielles Internet der Dinge | Industrielle Materialien | Gerätewartung und Reparatur | Industrielle Programmierung |
home  MfgRobots >> Industrielle Fertigung >  >> Industrial programming >> C Sprache

Polymorphie in C++: Praktischer Leitfaden

Polymorphie = „viele Formen“. Tritt typischerweise bei Klassenhierarchien mit Vererbung auf.

C++-Polymorphie: Aufruf einer Memberfunktion führt je nach Objekttyp zu unterschiedlicher Funktionsausführung.

Beispiel ohne virtual (Statische Bindung)

#include <iostream>
using namespace std;
class Shape {
protected: int width, height;
public:
    Shape(int a=0, int b=0) { width=a; height=b; }
    int area() { cout << "Parent class area:" << endl; return 0; }
};
class Rectangle: public Shape {
public:
    Rectangle(int a=0, int b=0):Shape(a,b) {}
    int area() { cout << "Rectangle class area:" << endl; return width*height; }
};
class Triangle: public Shape {
public:
    Triangle(int a=0, int b=0):Shape(a,b) {}
    int area() { cout << "Triangle class area:" << endl; return width*height/2; }
};
int main() {
    Shape* shape;
    Rectangle rec(10,7);
    Triangle tri(10,5);
    shape = &rec; shape->area();  // Ruft Shape::area() auf!
    shape = &tri; shape->area();  // Ruft Shape::area() auf!
    return 0;
}

Ausgabe (falsch):

Parent class area:
Parent class area:

Ursache: Compiler bindet area() statisch (zur Compile-Zeit) an Shape::area() – Early Binding / Static Linkage.

Mit virtual (Dynamische Bindung)

virtual vor area() in Basisklasse:

class Shape {
    // ...
    virtual int area() { cout << "Parent class area:" << endl; return 0; }
};

Nun Ausgabe (korrekt):

Rectangle class area
Triangle class area

Compiler schaut auf Inhalt des Pointers (Objekttyp), nicht nur Pointer-Typ. Da Adressen von rec und tri in shape gespeichert sind, werden jeweilige area() aufgerufen.

Jede Kindklasse hat eigene area()-Implementierung – so wird Polymorphie genutzt.

Virtuelle Funktionen

virtual-Funktion in Basisklasse signalisiert: Keine statische Bindung erwünscht. Stattdessen Auswahl zur Laufzeit basierend auf Objekttyp – Dynamic Linkage / Late Binding.

Rein virtuelle Funktionen (Pure Virtual Functions)

Wenn Basisklasse keine sinnvolle Implementierung bieten kann, aber Interface vorschreiben will:

class Shape {
protected: int width, height;
public:
    Shape(int a=0, int b=0) { width=a; height=b; }
    virtual int area() = 0;  // Pure virtual
};

= 0 bedeutet: Kein Body. Klasse wird abstrakt – nicht instanziierbar. Abgeleitete Klassen müssen implementieren.

C Sprache

  1. C++-Operatoren meistern: Ein vollständiger Leitfaden mit praktischen Beispielen
  2. Arrays an Funktionen in C++ übergeben: Ein praktischer Leitfaden
  3. C++ Klassen & Objekte: Praktischer Leitfaden zur objektorientierten Programmierung
  4. C++ Friend-Funktionen und Friend-Klassen: Zugriffskontrolle meistern
  5. C++ Klassentemplates meistern: Ein praktischer Leitfaden
  6. C++ Operator‑Overloading: Praktischer Leitfaden mit Code‑Beispielen
  7. C++ Speicherklassen: Scope, Lifetime & Verwendung
  8. C++ Overloading: Funktionen & Operatoren erklärt
  9. Datenabstraktion in C++: Interface-Implementierung-Trennung
  10. Datenkapselung in C++: Code schützen & strukturieren