2016-11-04 3 views
0

Wenn ich die Klasse PeekingIterator abgeleitet habe, und die Basisklasse Anruf Iterator. Die abgeleitete Klasse verwendet die Member- und Member-Funktion der Basisklasse erneut. In C++ erbt die Vererbung nicht das private Mitglied. Im folgenden Beispiel sind struct Data und Data* data private Mitglieder! Also meine Frage ist: Wie können wir Iterator::hasNext() Funktion innerhalb der abgeleiteten Klasse PeekingIterator aufrufen, wenn es nicht einmal erbt struct data und Data* data!?C++, Grundlagen zur Vererbung

Question Link

// Below is the interface for Iterator, which is already defined for you. 
// **DO NOT** modify the interface for Iterator. 
class Iterator { 
    struct Data; 
    Data* data; 
public: 
    Iterator(const vector<int>& nums); 
    Iterator(const Iterator& iter); 
    virtual ~Iterator(); 
    // Returns the next element in the iteration. 
    int next(); 
    // Returns true if the iteration has more elements. 
    bool hasNext() const; 
}; 


class PeekingIterator : public Iterator { 
public: 
    PeekingIterator(const vector<int>& nums) : Iterator(nums) { 
     // Initialize any member here. 
     // **DO NOT** save a copy of nums and manipulate it directly. 
     // You should only use the Iterator interface methods. 

    } 

    // Returns the next element in the iteration without advancing the iterator. 
    int peek() { 

    } 

    // hasNext() and next() should behave the same as in the Iterator interface. 
    // Override them if needed. 
    int next() { 

    } 

    bool hasNext() const { 

    } 
+0

Ich sehe das Problem nicht, Aufruf 'Iterator :: hasNext() 'sollte gut funktionieren .. Was ist die Frage? – HazemGomaa

+1

Vererbung gehört zu erben private Mitglieder. Sie sind einfach nicht zugänglich. Wenn Sie möchten, dass die Basisklasse diese beeinflusst, stellen Sie entweder public/protected member-Funktionen bereit, um erforderliche Operationen für sie auszuführen (die von abgeleiteten Klassen verwendet werden können). Sie können andere Funktionen bereitstellen, die einen Zeiger oder Verweis auf private Mitglieder geben (über die dann die Privaten geändert werden können), aber wenn Sie das tun, können Sie die Mitglieder auch öffentlich machen und damit fertig werden. – Peter

+0

Dumme Frage, wenn ich 'PeekingIterator pi' in' main' deklariere, kann ich die Basisklassenfunktion wie 'pi.Iteratorr :: hasNext()' aufrufen? –

Antwort

3

Inheritance in C++ bettet ein Objekt von einer Basisklasse in ein Objekt einer Unterklasse. Sie erben alles. Sie können nicht Zugriff alles direkt.

Jetzt, da hasNext() öffentlich ist, können Sie es anrufen (und immer noch, wenn es geschützt wäre). hasNext() selbst kann auf die privaten Teile von Iterator (die PeekingIterator von Iterator hinzugefügt werden) zugreifen. So wird alles funktionieren.

+0

Dumme Frage, wenn ich 'PeekingIterator pi' deklariere, kann ich' pi.Iteratorr :: hasNext() 'im' main' machen? –

+0

@Anni_housie Ja. So würden Sie die Basisklassenfunktion nennen. – StoryTeller

1

Also meine Frage ist: Wie können wir Iterator::hasNext() Funktion in der abgeleiteten Klasse nennen PeekingIterator, wenn es nicht einmal struct data und Data* data erbt!?

, dass der Grund der Kapselung ist - halten Sie die Daten privat (struct data), aber Sie öffentliche Memberfunktion (hasNext()) zu, so kann sie von abgeleiteten Klassen zugegriffen werden.

+0

Dumme Frage, wenn ich "PeekingIterator pi" in 'main' deklariere, kann ich die Basisklassenfunktion wie' pi.Iteratorr :: hasNext() 'aufrufen? –

1

Iterator::hasNext() kann von jeder Funktion in PeekingIterator aufgerufen werden. Zum Beispiel: