Hier sind keine Sicherheitsmaßnahmen erforderlich. So funktioniert C++.
Durch Überschreiben einer virtuellen Funktion in der Basisklasse wird die abgeleitete Klasse neu implementiert. Die Definition der "Neuimplementierung" beinhaltet jedoch, dass das gesamte Gepäck aus der Basisklasse übernommen wird. Einschließlich der Tatsache, dass die virtuelle Funktion in der Basisklasse in diesem Fall public
ist.
Die Tatsache, dass die abgeleitete Klasse die neu implementierte Funktion als private
definiert, ändert nichts an der Tatsache, dass sie eine öffentliche Funktion überschreibt. Und als solches sollte es erwarten, dass es weiterhin über die Basisklasse erreichbar ist.
höchstens, ich nehme an, Sie können dies eine "Eigenart" nennen. Die Quintessenz ist, dass, wenn Sie eine virtuelle Funktion public
überschreiben, der Prozess des Überschreibens die Tatsache nicht ändert, dass es eine öffentliche Funktion ist. Die übergeordnete Funktion "privat", in der abgeleiteten Klasse, schließt die Scheune, nachdem die Pferde bereits gegangen sind.
Und Sie müssen sich der Tatsache bewusst sein, dass Sie eine öffentliche virtuelle Funktion überschreiben. In einigen Situationen würde ich sagen, dass dies sogar ein Feature sein kann. Es wäre nicht allzu schwierig, sich eine Situation vorzustellen, in der eine bestimmte Basisklassenfunktion nur von dem vorhandenen Code aufgerufen werden sollte, der direkt auf die Basisklasse verweist. Jeder Code, der über einen Zeiger oder eine Referenz auf die abgeleitete Klasse verfügt, ist Code höherer Ebene, auf dem kein Unternehmen die Funktionen der Basisklasse aufrufen darf. Dies wäre natürlich eine Möglichkeit, dies zu tun. Dies ist sicherlich nicht als eine Art eiserne Sicherheit gedacht, sondern lediglich ein Mechanismus für den Compiler, der Ihnen hilft, logische oder funktionale Fehler zu finden oder Fehler zu konstruieren.
In C++ haben Sie Freunde, so dass Sie an ihre privaten Teile gelangen können. – Mikhail
Die Möglichkeit, dies zu visualisieren, besteht darin, dass die Zugriffsspezifizierer der abgeleiteten Klasse auf Zugriffe über lvalues des statischen Typs und seiner Nachkommen angewendet werden, anstatt die Zugriffsspezifizierer, die ihre Basis für den Zugriff durch basal lvalues deklariert hat, rückwirkend zu ändern am wenigsten schlecht, möglicherweise absurd. –