C ++,关于继承的基础知识

时间:2016-11-04 23:37:31

标签: c++ inheritance

如果我有一个名为PeekingIterator的派生类,那么基类调用Iterator。派生类重用基类的成员和成员函数。现在在C ++中,继承并不会继承私有成员。

但在下面的示例中,struct DataData* data是私人会员!所以我的问题是:当它甚至不继承Iterator::hasNext()PeekingIterator时,如何在派生类struct data中调用Data* data函数!?

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 {

    }

3 个答案:

答案 0 :(得分:3)

c ++中的继承将基类的对象嵌入到子类的对象中。你继承了一切。您无法直接访问所有内容。

现在,由于hasNext()是公开的,您可以调用它(如果它受到保护,仍然可以)。 hasNext()本身可以访问Iterator的私有部分(由PeekingIterator添加到Iterator)。所以一切都会奏效。

答案 1 :(得分:1)

  

所以我的问题是:当它甚至不继承Iterator::hasNext()PeekingIterator时,如何在派生类struct data内调用Data* data函数!?

这是封装的基础 - 您将数据保密(struct data),但是您公开了公共成员函数(hasNext()),以便派生类可以访问它。

答案 2 :(得分:1)

可以从Iterator::hasNext()中的任何函数调用

PeekingIterator。例如:

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