【问题标题】:C++ templates and inheritanceC++ 模板和继承
【发布时间】:2010-09-24 13:07:34
【问题描述】:

我可以这样混合继承和模板吗? :

template <class T> 
class AbstractType { // abstract
//....
}

template <class T> 
class Type1 : public AbstractType<T> {
//....
}

以后,我可以像这样使用这些类吗:

AbstractType<SomeClass>* var1 = new Type1<SomeClass>();

谢谢帮助。

【问题讨论】:

    标签: c++ templates inheritance


    【解决方案1】:

    是的,你可以。您可以随意使用模板参数,并将其传递到包含的基本模板类中。

    【讨论】:

    • 酷 :) 我想知道为什么 stl 中没有 anstractlist ?这似乎是可行的,并且可以使用不同的列表实现。
    • @Seba - 已经允许使用自定义分配器。您还希望更改哪些其他实现细节?
    • @Seba:我没有看到任何令人信服的案例来拥有一个基类。通常选择容器是因为对性能/接口的精确要求,而 STL 为所述要求提供了最有效的实现。 STL 的设计理念与 OO 完全不同(而且是为了更好)。
    • @Seba:Matthieu M. 是对的。以接口方式进行操作就是以 OO 方式进行操作。 STL 是基于模板的。只要您尊重列表的 STL 接口,您就可以将一个列表替换为另一个列表,而无需在它们之间存在基类和虚拟方法。就像列奥尼达斯曾经宣称的那样:this is templates!... ^_^ ...
    • @Seba:不完全是(即使这是副作用)。泛型编程的真正意义在于避免不必要的基类。 OOP 完全是关于基类和常见的重写方法。 C++ 是多范式的,在当前情况下,泛型编程(具有类似的接口)比 OOP(通用基类)做得更好,耦合更少。 “相似”这个词在这里非常重要:我没有写“完全相同的界面”。这不是错误。
    【解决方案2】:

    你可以,但它不会像你想象的那么有用。您可以像这样定义结构:

    #include <string>
    #include <vector>
    using namespace std;
    
    template<typename Val>
    class Base
    {
    public:
        virtual Val DoIt() const = 0;
    };
    
    template<typename Val>
    class Derived : public Base<Val>
    {
    public:
        Derived(const Val& val) : val_(val) {};
        Val DoIt() const { return val_; }
    protected:
        Val val_;
    };
    
    int main()
    {
        Derived<string> sd("my string");
        string sd_val = sd.DoIt();
    
        Derived<float> fd(42.0f);
        float fd_val = fd.DoIt();
    }
    

    但是当您定义抽象基类型时,您通常会需要它们的集合,并且能够通过基类指针调用以获得多态行为。如果您将基类模板化,您将无法做到这一点,因为模板参数的每个变体都会创建不同的类型。 Base&lt;int&gt;Base&lt;string&gt; 完全不同,您不能只获得指向其中任何一个的 Base*

    这段代码不会编译:

    vector<Base*> my_objs;
    

    【讨论】:

      【解决方案3】:

      你可以在类模板中使用任何类型,只要该类型与类定义兼容

      例如

      template<class T> struct S{
         T mt;
      };
      

      这样的结构可以实例化为 T = int, T = double,但不能实例化 T = void。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-04-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多