带有接口(interface)对象的 C++ 模板

标签 c++ templates inheritance

我有以下无法编译的代码。

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/

相关文章:

c++ - QT Creator 链接器错误 : Link2019 File Not Found

c++ - 如何从 C++ 中的不同目录运行命令行工具

c++ - 如何在模板中使用嵌套的 typedef?

php - 是否为自动加载类的父类调用了 __autoload()?

javascript - 为什么 JavaScript 使用原型(prototype)继承来实现?

c++ - Eigen,RowXpr 的函数

c++ - 有没有办法在 boost::icl::interval_map 中获取间隔数?

c++ - 模板参数计算

c++ - 推导模板函数中的数组大小,传递值与传递引用的差值

c# - 强制在基类内部调用基类虚方法