可以(编辑:)我会做这样的事情吗?
修改
我会尝试询问一个可能更适合这种继承方案的例子。请注意,这不是一个工人阶级,只是为了概念。
template<typename T>
class Tree {
protected:
class Node {
Node* _parent;
T _data
};
};
template<typename T>
class BinaryTree: public Tree {
private:
class BinaryNode: public Tree<T>::Node {
Node *_left, *_right;
};
};
答案 0 :(得分:0)
这种构建并行类层次结构的方法并不罕见。但是,更常见的是将嵌套的派生类隐藏为应该封装的实现细节,即示例中的BiIterator
将位于private:
部分。
但是,由于对象切片,Iterator
不是一个很好的例子:即使BiIterator
仍然公开,这个看似无辜的代码也是错误的:
BidirectionalList biList;
// This would slice off BiIterator's functionality
Iterator iter(biList.get_iterator());
while (iter.has_next()) {
...
}
更好的例子是,如果基类成员函数接受引用或指向基类中定义的嵌套类的对象的指针,派生类将为其传递其派生的嵌套类:
class Task {
public:
class Worker {
public virtual void work()=0;
}
void run(Worker& w);
};
class SpecialTask : public Task {
private:
class SpecialWorker : public Worker {
public virtual void work() {
...
}
};
public:
void do_something() {
SpecialWorker w;
run(w); // Passes SpecialWorker to run() of base class
}
};
答案 1 :(得分:0)
您正在做的事情没有任何违法行为,因此您可以这样做。
至于应该你,那不太明确。
但是对于这个例子,我认为答案很明确。在实现C ++容器时,他们决定与所有容器类分开实现iterator
。在这种情况下,从他们的智慧中获益并不是一个糟糕的选择。
修改强>
对于容器结构,应该对包含的对象类型进行模板化。为了我的证明,我再次参考C ++容器设计。
但在这里我认为它更明确。如果你写了一个很好的Tree
或BinaryTree
class
,那么你就可以在你生命中写下的所有代码中反复使用它。为什么不利用这个呢?
(请注意,你可能会在这里重新发明轮子。看看这个:http://www.cplusplus.com/reference/algorithm/make_heap/)