【发布时间】:2011-02-10 23:46:22
【问题描述】:
标题可能没有多大意义,所以我将从一些代码开始:
class Foo : public std::vector<Foo>
{
};
...
Foo f;
f.push_back( Foo() );
为什么编译器允许这样做?在这个阶段我的大脑正在融化,所以任何人都可以解释你是否有任何理由想要这样做?不幸的是,我刚刚在一些生产 C# 代码中看到了类似的模式,并想知道为什么有人会使用这种模式。
【问题讨论】:
-
为什么不允许?
std::vector<Foo>只是另一种类型,您可以像任何其他类类型一样从它继承。也就是说,您的示例尤其糟糕,因为大多数标准库都不是为了继承而设计的。 -
@GMan:因为
std::vector<Foo>是一个依赖于Foo的类型,它刚刚被定义。或者换句话说: foo 是 foos 的向量,所以 foo 是 foos 的向量的向量,所以 foo 是 foos 的向量的向量... 无穷无尽。 -
@GMan - 是的,这只是我可以编写的一个简单示例 - 不想通过定义模板类来污染示例。维基百科文章列出了几个我可以理解的例子。我的例子是一个简单的愚蠢的例子,同意。 @sepp2k 是的,让我困惑的是看似递归。
-
@sepp2k:这并没有错,欢迎使用递归数据结构。链表:struct LLNode { LLNode *next; }, 二叉树结构 BTNode { BTNode *left,*right; }。完全一样。
标签: c# c++ generics templates derived-class