Was verbirgt sich hinter den Vererbungsmodifikatoren in C++?
\n\nStellen Sie sich vor, Sie sind ein Architekt. Sie haben einen Bauplan für ein "Gebäude" (Basisklasse) und möchten drei verschiedene "Häuser" (abgeleitete Klassen) danach bauen. Ein Haus wird eine exakte Kopie mit einem öffentlichen Eingang (public) sein, das zweite mit einem geschlossenen Innenhof (private) und das dritte mit Zugang nur für Familie und Freunde (protected). In C++ funktionieren die Vererbungsmodifikatoren genau so. Aber beeinflusst diese Wahl die Geschwindigkeit des Programms? Spoiler: sowohl ja als auch nein. Lassen Sie uns herausfinden, wie Sie sich nicht ins Bein schießen und gleichzeitig den Code optimieren.
Diese Frage ist eine der beliebtesten auf Stack Overflow (Zehntausende von Aufrufen), und das aus gutem Grund. Anfänger verwechseln oft die Zugriffsebene auf Klassenmitglieder und den Vererbungstyp. Erfahrene Entwickler wissen: Die richtige Wahl der Vererbung kann Stunden des Debuggens sparen und das Programm sogar ein wenig beschleunigen. Heute auf pythonlib.ru schließen wir dieses Thema ein für alle Mal ab.
\n\nDas Dreieck der Vererbung: public, private, protected
\n\nZunächst die Grundlagen. Stellen Sie sich vor, wir haben eine Basisklasse Animal:
class Animal {\npublic:\n void eat() { /* ... */ }\nprotected:\n int age;\nprivate:\n std::string secretDNA;\n};\n\nSchauen wir uns nun an, wie die drei Vererbungstypen den Zugriff auf diese Mitglieder in der abgeleiteten Klasse Dog verändern.
1. Public-Vererbung – "wie es ist"
\nDer häufigste und intuitivste Typ. Alle Zugriffsebenen bleiben unverändert:
\n- \n
public→public(für alle zugänglich) \n protected→protected(für Erben zugänglich) \n private→ nicht zugänglich (bleibt in der Basisklasse) \n
Verwenden Sie dies, wenn Sie die Beziehung "Dog IS-A Animal" ausdrücken möchten. Das ist klassische OOP.
\n\n2. Protected-Vererbung – "nur für Eingeweihte"
\nAlle public-Mitglieder der Basisklasse werden in der abgeleiteten Klasse zu protected:
\n- \n
public→protected\n protected→protected\n private→ nicht zugänglich \n
Dies wird benötigt, wenn Sie Implementierungsdetails vor der Außenwelt verbergen, aber den Zugriff für "Enkel" erlauben möchten. Beispielsweise verwendet die Bibliothek Boost protected-Vererbung aktiv für interne Mechanismen.
\n\n3. Private-Vererbung – "meins und nur meins"
\nDer strengste Modus. Alle public- und protected-Mitglieder werden zu private:
\n- \n
public→private\n protected→private\n private→ nicht zugänglich \n
Dies ist die Beziehung "Dog wird DURCH Animal implementiert". Wird oft anstelle von Komposition zur Optimierung verwendet (dazu weiter unten).
\n\nLeistung: Wo der Hund begraben liegt?
\n\nUnd nun zur spannenden Frage: Beeinflusst der Vererbungstyp die Leistung? Kurz gesagt: direkt – nein, aber indirekt – sehr wohl.
\n\nMythos: Private-Vererbung ist schneller als public
\nEinige denken, dass private-Vererbung "überflüssige Prüfungen entfernt". Das stimmt nicht. Zugriffsmodifikatoren (public, protected, private) sind ein reines Compile-Zeit-Konzept. Der Compiler prüft sie während der Build-Phase und generiert denselben Maschinencode. Es gibt keinen Unterschied zur Laufzeit.
Realität: Optimierung durch Empty Base Optimization (EBO)
\nHier beschleunigt private-Vererbung das Programm tatsächlich! Wenn die Basisklasse keine Daten enthält (leere Klasse), kann der Compiler bei public- oder protected-Vererbung ein zusätzliches Byte zur Ausrichtung hinzufügen (muss es aber nicht). Bei private-Vererbung greift die Empty Base Optimization.