Ich ging ein paar Beispielfragen für einen kommenden Test durch, und diese Frage verwirrte mich total.
Betrachten Sie den folgenden Code:
%Vor% Wenn das Wort "public" weggelassen wird, verwendet GraduateStudent
private Vererbung, was bedeutet Folgendes?
GraduateStudent
-Objekte dürfen keine Methoden von Student
verwenden.
GraduateStudent
hat keinen Zugriff auf private Objekte von Student
.
Keine Methode von GraduateStudent
darf eine Methode von Student
aufrufen.
Nur const
Methoden von GraduateStudent
können Methoden von Student
aufrufen.
Obwohl dies eine nackte Hausaufgabenfrage ist, werde ich sie beantworten, weil es eine schreckliche Frage ist. Ich würde es fast als eine Trickfrage betrachten, und es stellt nicht wirklich eine gute Prüfung des Wissens dar.
Die Antwort ist 2. GraduateStudent hat keinen Zugriff auf private Objekte von Student. , außer dass dies nichts mit privater Vererbung zu tun hat. Punkt 2 wäre wahr, unabhängig davon, ob das Schlüsselwort public
vorhanden ist oder nicht, da die abgeleiteten Klassen nie unabhängig von ihrer Übernahme Zugriff auf die privaten Mitglieder ihrer Basisklassen haben.
Private Vererbung bedeutet im Wesentlichen zwei Dinge (im Gegensatz zur öffentlichen Vererbung):
Alle öffentlichen Methoden von Student
werden zu privaten Methoden in GraduateStudent
. Das heißt, wenn beispielsweise Student
eine öffentliche Methode foo()
hat, dann hat GraduateStudent
eine private Methode foo()
.
Die Basisklasse ist "unzugänglich", was bedeutet, dass Polymorphismus nicht funktioniert. Für Laien bedeutet dies, dass, wenn GraduateStudent
privat von Student
erbt, dann können Sie nicht ein GraduateStudent*
behandeln, als wäre es ein Student*
(oder ein GraduateStudent&
als wäre es ein Student&
).
Es ist möglich, dass der Autor der Frage auch gemeint hat, dass Punkt 1 eine richtige Antwort ist, aber es ist zweideutig formuliert. Was bedeutet es, dass " GraduateStudent
objects keine Methoden von Student
verwenden können"? Es ist möglich, dass dies bedeutet, dass Sie keine von Student
geerbten Methoden auf -Objekten vom Typ GraduateStudent
aufrufen können, wie ich oben im ersten Punkt geschrieben habe, sondern das GraduateStudent
-Objekt selbst, innerhalb seiner Methoden, kann Methoden von Student
verwenden.
Zum Beispiel:
%Vor%Nicht wahr, alle GraduateStudent-Objekte können interne oder geschützte Mitglieder von Schülern (offensichtlich sind dies private Mitglieder hier) als Ausnahme verwenden. Auch jeder Außenstehende, der diese Objekte verwendet, kann nicht auf die Basis-Student-Klasse des Objekts zugreifen, der Zugriff auf die Basisklasse muss im Kontext der GraduateStudent-Methoden erfolgen.
%Vor%Ja
%Vor%Nicht wahr
%Vor%Nein, es gibt keine Unterscheidung, dass const-Member mehr Zugriff auf die Basisklasse haben als nicht-konstante Mitglieder.
Die einzige korrekte Antwort, die ich sehe, ist 2, aber das hängt nicht davon ab, ob GraduateStudent
privat oder öffentlich von Student
erbt.
Private Vererbung bedeutet, dass es privates Wissen ist, dass GraduateStudent
ein Student
ist, also nur Freunde von GraduateStudent
und GraduateStudent
Mitglieder können static_cast
GraduateStudent&
bis Student&
und GraduateStudent*
bis Student*
, greifen Sie auf öffentliche oder geschützte Member-Variablen von Student
zu und rufen Sie öffentliche oder geschützte Member-Funktionen von Student
auf.
Siehe: Ссылка
Erstens: Der Vererbungszugriffs-Spezifizierer ändert nicht die Art und Weise, wie Derived
mit Base
interagiert, er ändert die Art, wie die Welt ein Derived
-Objekt behandeln kann, als wäre es ein Base
.
Überlegen Sie:
%Vor% Eine sehr einfache Tabelle: Ich fasse zusammen, auf welche Zonen von A
die verschiedenen Akteure zugreifen können.
Hinweis (*): Ein Freund hat die gleichen Rechte wie das Objekt selbst, keine Überraschung.
Eine einfache Faustregel besagt, dass der Vererbungszugriffsbezeichner die Zugriffsbezeichner der Basisklasse außer Kraft setzt, wenn sie loser sind.
Da nichts loser als public
ist, ändert es nichts. protected
bedeutet, dass der public
-Abschnitt von Base
zu protected
wird und private
bedeutet, dass die Abschnitte public
und protected
zu private
werden.
Tags und Links c++