我有以下无法编译的代码。
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 添加项)更适合我的需求。
最佳答案
类 Group<Base>
和 Group<Derived>
是完全不相关的,不同的类别。指向它们的指针在任何方向都不可转换。
如果你需要运行时多态行为,你的类模板Group
可以从一个公共(public)的(非模板化的)基类派生:
class Group // base
{
virtual ~Group() { }
};
template <typename T>
class ConcreteGroup : public Group
{
// ...
T * m_impl;
};
Group * g1 = new ConcreteGroup<A>;
Group * g1 = new ConcreteGroup<B>;
关于带有接口(interface)对象的 C++ 模板,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7184183/