我正在构建一个包含3个类Node
,Leaf
和Branch
的树结构。
Node
是树节点的抽象类。Leaf
派生自Node
,但不能生孩子。Branch
派生自Node
,可以有孩子并拥有方法add(Node*)
我有像Book
这样的具体课程,Leaf
和BookShelf
是Branch
。但是,如果BookShelf
是Branch
,我会加倍,因为当add(Node*)
不是图书时方法Node*
无效。因此Branch
接口不适用于BookShelf
。如何处理这些事情?
答案 0 :(得分:3)
如果您尝试将BookShelf::add()
限制为库项目,则需要使用泛型(也称为模板)。您还需要定义一个抽象类LibraryItem
来翻译Node
的概念。
Branch
应该是T
类型的模板(用于定义成员列表和add
的参数)LibraryItem
派生自Node
Book
派生自Leaf
和LibraryItem
BookShelf
派生自Branch<LibraryItem>
和LibraryItem
答案 1 :(得分:1)
通过继承很好地对集合进行建模是发明模板的主要动机之一。
class Book {
// ...
};
typedef std::vector<Book> book_shelf;
完成。