如果我有一个名为PeekingIterator
的派生类,那么基类调用Iterator
。派生类重用基类的成员和成员函数。现在在C ++中,继承并不会继承私有成员。
但在下面的示例中,struct Data
和Data* data
是私人会员!所以我的问题是:当它甚至不继承Iterator::hasNext()
和PeekingIterator
时,如何在派生类struct data
中调用Data* data
函数!?
// 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 :(得分: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();
....
}