继承自c ++中的模板类

假设我们有一个模板类Area ,它具有成员变量T areaT getArea()void setArea(T)成员函数。

我可以通过键入Area<int>来创建特定类型的Area对象。

现在我有一个继承Area类的Rectangle类。 由于Rectangle本身不是模板,因此我无法键入Rectangle<int>

我如何专门化Rectangle对象的继承Area类型?

编辑:对不起,我忘了澄清 - 我的问题是是否有可能继承区域没有专门化,所以它不是继承为区域的整数,但作为面积矩形可以专门化的类型。


为了理解模版,直接使用术语具有巨大的优势,因为您所讲的关于它们的方式决定了思考它们的方式。

具体而言, Area不是模板类,而是类模板。 也就是说,它是可以从中生成类的模板。 Area<int>就是这样一个类(它不是一个对象,但是你可以用同样的方法创建一个来自该类的对象,你可以从任何其他类创建对象)。 另一个这样的类将是Area<char> 。 请注意,这些是完全不同的类,除了它们是从同一个类模板生成的事实外,它们没有什么共同之处。

因为Area不是一个类,所以你不能从它派生类Rectangle 。 你只能从另一个类(或其中的几个)中派生出一个类。 由于Area<int>是一个类,因此可以从中派生出Rectangle

class Rectangle:
  public Area<int>
{
  // ...
};

由于Area<int>Area<char>是不同的类,所以您甚至可以同时从两者中派生出来(但是,在访问它们的成员时,您必须处理不明确性):

class Rectangle:
  public Area<int>,
  public Area<char>
{
  // ...
};

但是,您必须指定从定义Rectangle时派生出哪些分类。 无论这些类是否是从模板生成的,都是如此。 相同类的两个对象根本不能有不同的继承层次结构。

你可以做的是把Rectangle做成模板。 如果你写

template<typename T> class Rectangle:
  public Area<T>
{
  // ...
};

您有一个模板Rectangle ,您可以从中获取从Area<int>派生的类Rectangle<int>以及从Area<int> Rectangle<char>派生的不同类Rectangle<char> Area<char>

它可能是你想要一个单一类型的Rectangle这样你就可以将各种Rectangle传递给同一个函数(它本身不需要知道Area类型)。 由于通过实例化模板Rectangle生成的Rectangle<T>类在形式上彼此独立,因此它不会以这种方式工作。 但是,您可以在这里使用多重继承:

class Rectangle // not inheriting from any Area type
{
  // Area independent interface
};

template<typename T> class SpecificRectangle:
  public Rectangle,
  public Area<T>
{
  // Area dependent stuff
};

void foo(Rectangle&); // A function which works with generic rectangles

int main()
{
  SpecificRectangle<int> intrect;
  foo(intrect);

  SpecificRectangle<char> charrect;
  foo(charrect);
}

如果您的泛型Rectangle从泛型Area派生出来很重要,那么您也可以使用与Area相同的技巧:

class Area
{
  // generic Area interface
};

class Rectangle:
  public virtual Area // virtual because of "diamond inheritance"
{
  // generic rectangle interface
};

template<typename T> class SpecificArea:
  public virtual Area
{
  // specific implementation of Area for type T
};

template<typename T> class SpecificRectangle:
  public Rectangle, // maybe this should be virtual as well, in case the hierarchy is extended later
  public SpecificArea<T> // no virtual inheritance needed here
{
  // specific implementation of Rectangle for type T
};

你只是试图从Area<int>派生? 在这种情况下,你这样做:

class Rectangle : public Area<int>
{
    // ...
};

编辑:在澄清之后,看起来你实际上正在尝试使Rectangle成为一个模板,在这种情况下,以下内容应该可以工作:

template <typename T>
class Rectangle : public Area<T>
{
    // ...
};

class Rectangle : public Area<int> {
};
链接地址: http://www.djcxy.com/p/69065.html

上一篇: Inheriting from a template class in c++

下一篇: C++ Composite Template Class Factory