【发布时间】:2011-11-03 07:02:21
【问题描述】:
我有以下无法编译的代码。
class Base {
public:
virtual ~Base() { };
};
class Derived : public Base { };
class NotDerived { };
template <typename T>
class Group { };
int main() {
Group<Base> *g = NULL;
g = new Group<Base>(); // Works
g = new Group<Derived>(); // Error, but I want it to work
g = new Group<NotDerived>(); // Error, as expected
}
我知道这不会编译,因为g 是与Group<Derived> 不同的类型。为了在 Java 中完成这项工作,我会做一些事情,例如Group<? extends Base> g,但据我所知,C++ 没有那个关键字。可以做什么?
编辑:我想澄清一下,我不希望将不是从Base 派生的类型设置为g。我更新了我的示例来解释这一点。
编辑 2:我的问题有两种解决方案。 Dave's 我发现它很简单,很容易定义。但是Bowie's(以及Mark's 的补充)更适合我的需求。
【问题讨论】:
-
我不熟悉这种东西在 Java 中是如何工作的。你想用这种语法表达什么?
-
这在 Java 中也不起作用。
<? extends ...>的语法不是为了支持协方差,而是对泛型可以使用的类型添加约束。 -
Nicol:这样我就可以拥有一种返回某种类型接口的工厂类。马克:它确实可以在 Java 中工作。 Praetorian:这似乎正是我的问题,谢谢!
标签: c++ templates inheritance