C++ 模板和继承

标签 c++ templates inheritance

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

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

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

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

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();
}

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

这段代码不会编译:

vector<Base*> my_objs;

关于C++ 模板和继承,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3787350/

相关文章:

WPF DataGrid 列忽略宽度

ruby - 父类(super class)不匹配、结构、重新加载和 Spork

c# - .Net Fakes - 当基类是抽象的时如何填充继承的属性?

php - 使 DateTime::createFromFormat() 返回子类而不是父类

c++ - fatal error : iostream: No such file or directory - Can you help fix this?

c++ - 无法完成构建 cgal sln

c++ - 贪吃蛇游戏 - 食物 block 的随机数生成器

c++ - 使用 QWebPage 加载页面

c++ - 有没有办法在模板类中处理可变数量的参数?

c++ - 仅为类的特定模板实例化声明成员函数