Rya*_*yan 7 c++ inheritance templates
我有以下不编译的代码.
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
}
Run Code Online (Sandbox Code Playgroud)
我知道这不会编译,因为它g是一种不同的类型Group<Derived>.为了在Java中工作,我会做一些事情Group<? extends Base> g,但据我所知,C++没有那个关键字.可以做些什么?
编辑:我想澄清,我不希望它可以设置不从派生类型Base的g.我已经更新了我的例子来解释这一点.
这些类Group<Base>和Group<Derived>完全不相关的,不同的班级.指向它们的指针在任何一个方向都不可转换.
如果需要运行时多态行为,则类模板Group可以从公共(非模板化)基类派生:
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>;
Run Code Online (Sandbox Code Playgroud)
您可以使 Group<Base> 成为所有 Group<T>T!=Base 的基类。
class Base {
public:
virtual ~Base() { };
};
class Derived : public Base { };
template <typename T> class Group;
struct Empty { };
template <typename T>
struct base_for_group_t {
typedef Group<Base> type;
};
template <>
struct base_for_group_t<Base> {
typedef Empty type;
};
template <typename T>
class Group : public base_for_group_t<T>::type { };
int main() {
Group<Base> *g = 0;
g = new Group<Base>(); // Works
g = new Group<Derived>(); // now works
}
Run Code Online (Sandbox Code Playgroud)