2016-11-04 86 views
0

如果我派生類叫做PeekingIterator,而基類叫Iterator。派生類重用基類的成員和成員函數。現在在C++中,繼承不會繼承私有成員。C++,關於繼承的基礎知識

但在下面的例子中,struct DataData* data是私人會員!所以我的問題是:我們如何在派生類PeekingIterator內部調用Iterator::hasNext()函數,它甚至不會繼承struct dataData* data!?

Question Link在C

// 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

我沒有看到問題,調用'Iterator :: hasNext()'應該可以正常工作..有什麼問題嗎? – HazemGomaa

+1

繼承DOES包括繼承私人成員。他們只是無法訪問。如果您希望基類影響它們,請提供public/protected成員函數以對其執行必需的操作(可由派生類使用)。您可以提供其他功能,爲私人成員提供指針或引用(通過這些功能,私人可以隨後進行更改),但是 - 如果您這樣做 - 則可以讓成員公開並完成它。 – Peter

+0

愚蠢的問題,如果我在'main'聲明'PeekingIterator pi',我能夠調用基類函數,比如'pi.Iteratorr :: hasNext()'嗎? –

回答

3

繼承++嵌入一個基類的對象成子類的一個對象。你繼承的一切。你不能直接訪問

現在,由於hasNext()是公開的,因此您可以調用它(並且如果它受到保護,仍然可以)。 hasNext()本身可以訪問Iterator的私有部分(通過Iterator添加到PeekingIterator)。所以一切都會奏效。

+0

愚蠢的問題,如果我聲明'PeekingIterator pi',我可以在'main'中執行'pi.Iteratorr :: hasNext()'嗎? –

+0

@Anni_housie是的。這就是你如何調用基類函數。 – StoryTeller

1

所以我的問題是:我們如何才能調用派生類PeekingIterator裏面Iterator::hasNext()功能,當它甚至不繼承struct dataData* data!?

這是封裝的基礎 - 你保持數據的私有性(struct data),但你暴露的公共成員函數(hasNext()),所以它可以被派生類訪問。

+0

愚蠢的問題,如果我在'main'中聲明'PeekingIterator pi',我能夠調用基類函數,比如'pi.Iteratorr :: hasNext()'嗎? –

1

Iterator::hasNext()可以從PeekingIterator中的任何函數調用。例如:

bool PeekingIterator::hasNext() { 
    bool b = Iterator::hasNext(); 
    .... 
}