Einfache Vererbung in C ++

7

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?

  1. GraduateStudent -Objekte dürfen keine Methoden von Student verwenden.

  2. GraduateStudent hat keinen Zugriff auf private Objekte von Student .

  3. Keine Methode von GraduateStudent darf eine Methode von Student aufrufen.

  4. Nur const Methoden von GraduateStudent können Methoden von Student aufrufen.

xbonez 28.05.2010, 14:24
quelle

4 Antworten

22

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):

  1. 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() .

  2. 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%     
Tyler McHenry 28.05.2010, 14:33
quelle
3
%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.

    
display101 28.05.2010 14:37
quelle
3

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: Ссылка

    
Daniel Trebbien 28.05.2010 14:34
quelle
1

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.

%Vor%

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.

    
Matthieu M. 28.05.2010 15:41
quelle

Tags und Links