【问题标题】:Why can I derived from a templated/generic class based on that type in C# / C++为什么我可以从 C#/C++ 中基于该类型的模板/泛型类派生
【发布时间】:2011-02-10 23:46:22
【问题描述】:

标题可能没有多大意义,所以我将从一些代码开始:

class Foo : public std::vector<Foo>
{
};

...

Foo f;

f.push_back( Foo() );

为什么编译器允许这样做?在这个阶段我的大脑正在融化,所以任何人都可以解释你是否有任何理由想要这样做?不幸的是,我刚刚在一些生产 C# 代码中看到了类似的模式,并想知道为什么有人会使用这种模式。

【问题讨论】:

  • 为什么不允许? std::vector&lt;Foo&gt; 只是另一种类型,您可以像任何其他类类型一样从它继承。也就是说,您的示例尤其糟糕,因为大多数标准库都不是为了继承而设计的。
  • @GMan:因为std::vector&lt;Foo&gt; 是一个依赖于Foo 的类型,它刚刚被定义。或者换句话说: foo 是 foos 的向量,所以 foo 是 foos 的向量的向量,所以 foo 是 foos 的向量的向量... 无穷无尽。
  • @GMan - 是的,这只是我可以编写的一个简单示例 - 不想通过定义模板类来污染示例。维基百科文章列出了几个我可以理解的例子。我的例子是一个简单的愚蠢的例子,同意。 @sepp2k 是的,让我困惑的是看似递归。
  • @sepp2k:这并没有错,欢迎使用递归数据结构。链表:struct LLNode { LLNode *next; }, 二叉树结构 BTNode { BTNode *left,*right; }。完全一样。

标签: c# c++ generics templates derived-class


【解决方案1】:

谁能解释你是否有任何理由想要这样做?

Curiously recurring template pattern.

【讨论】:

  • 非常感谢,我不知道名字,因此无法搜索!
猜你喜欢
  • 1970-01-01
  • 2014-03-22
  • 2010-12-22
  • 1970-01-01
  • 2011-08-18
  • 2013-10-08
  • 2012-09-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多