Ich bin verwirrt über Überprüfung von Zugriffsbezeichner statisch oder dynamisch zu verstehen. Es wird gesagt, dass Zugriffsbezeichner nicht dynamisch überprüft werden. Was bedeutet das ?Sie möchten die Aussage „Barrierrefreiheit wird geprüft, statisch und nicht dynamisch in C++“
Dieses Beispiel wurde von verschiedenen posts auf SO genommen. Betrachten Sie dieses Beispiel
Beispiel A:
class Base
{
public:
virtual void Message() = 0;
};
class Intermediate : public Base
{
//Is Message method virtual here too ? is it private or public ?
};
class Final : public Intermediate {
void Message() {
cout << "Hello World!" << endl;
}
};
Final final;
Jetzt nehme ich an so etwas wie dieses
Final* finalPtr = &final;
finalPtr->Message();
die oben nicht funktionieren und mein Verständnis ist, dass die Nachricht Methode in Final Klasse ist privat. Ist das korrekt ? Wenn ja, warum funktioniert das? das Verfahren in
Intermediate* finalPtr = &final; // or Base* finalPtr = &final;
finalPtr->Message();
ist der Grund, warum der obige Code funktioniert, weil die Basisklasse Zeiger mit einer abgeleiteten Klasse instanziiert wird. Wenn ja, warum funktioniert der Aufruf von Message()? Der Post zu SO besagt, dass die Vererbung öffentlich ist und daher als öffentliche Funktion vererbt wird. Auf der anderen Seite hat die Funktion selbst in der Klasse den privaten Zugriffsspezifizierer (da standardmäßig ihr privater in einer Klasse ist). Ich bin hier verwirrt und ich würde mich freuen, wenn jemand das klären könnte. Wäre es richtig zu sagen, wenn eine Basisklasse mit einer abgeleiteten Klasse instanziiert wird. Dann hat der Zugriffsspezifizierer der Basisklassenmethode Vorrang vor dem Zugriffsspezifizierer der abgeleiteten Klasse?
Update:
Auch bemerkte ich, dass, wenn ich ändern, um die Intermediate
und Final
Code der folgenden
class Intermediate : public Base
{
public: //Incase this public was absent then the following example wont work
void Message() {
cout << "Hello World! Intermediate" << endl;
}
};
class Final : public Intermediate {
void Message() {
cout << "Hello World! final" << endl;
}
};
und verwenden Sie es als solche
Intermediate* i = new Final();
i->Message();
Dann inorder Holen Sie sich den Ausgang "Hello World! final"
ist es notwendig, die Schnittstelle zu markieren Methode als öffentlich. Warum das ? Die Methode Message
wurde als öffentlich vererbt. Warum muss ich es jetzt als öffentlich kennzeichnen?
Sie sollten die anderen Beiträge verlinkt haben. Weil du es nicht getan hast, wirst du genau dieselbe Erklärung bekommen, die du nicht verstehst. –
gerade hinzugefügt den Link – Rajeshwar