Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/137.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;模板和继承_C++_Templates_Inheritance - Fatal编程技术网

C++ C++;模板和继承

C++ C++;模板和继承,c++,templates,inheritance,C++,Templates,Inheritance,我可以这样混合继承和模板吗 template <class T> class AbstractType { // abstract //.... } template <class T> class Type1 : public AbstractType<T> { //.... } 模板 类AbstractType{//abstract //.... } 模板 类Type1:公共抽象类型{ //.... } 稍后,我可以像这样使用这些类: Abstr

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

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

template <class T> 
class Type1 : public AbstractType<T> {
//....
}
模板
类AbstractType{//abstract
//....
}
模板
类Type1:公共抽象类型{
//....
}
稍后,我可以像这样使用这些类:

AbstractType<SomeClass>* var1 = new Type1<SomeClass>();
#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();
}
AbstractType*var1=newType1();

谢谢您的帮助。

是的,您可以。您可以将模板参数用于任何需要的内容,并传递到包含的基本模板类中。

您可以将任何类型与类模板一起使用,前提是该类型与类定义兼容

e、 g

模板结构{
T-mt;
};

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

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

AbstractType<SomeClass>* var1 = new Type1<SomeClass>();
#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();
}

酷:)我想知道为什么stl中没有翻译列表?这似乎是可行的,可以使用不同的列表实现。@Seba-已经允许使用自定义分配器。您还希望更改哪些其他实现细节?@Seba:我看不出有任何令人信服的理由需要基类。选择容器通常是因为对性能/接口的精确要求,STL为所述要求提供了最有效的实现。STL是以一种与OO完全不同的思维方式(而且更好)构建的。@Seba:Matthieu M.是对的。使用接口方式就是使用OO方式。STL是基于模板的。只要尊重列表的STL接口,就可以用一个列表替换另一个列表,而不需要在它们之间有基类和虚拟方法。就像Leonidas曾经声明的:
这是模板…^ ^ ^@塞巴:不完全是(即使这是副作用)。泛型编程的真正目的是避免不必要的基类。OOP是关于基类和常用重写方法的。C++是多范例的,在当前的情况下,泛型编程(具有类似的接口)比OOP(公共基类)更好,并且耦合更少。“相似”一词在这里非常重要:我没有写“完全相同的界面”。这不是一个错误。