inheritance自c ++中的模板类

假设我们有一个模板类Area ,它有一个成员variablesT area ,一个T getArea()和一个void setArea(T)成员函数。

我可以通过键入Area<int>来创build特定types的Area对象。

现在我有一个inheritanceArea类的Rectangle类。 由于Rectangle本身不是模板,我不能inputRectangle<int>

我如何专门化Rectangle对象的inheritanceAreatypes?

编辑:对不起,我忘了澄清 – 我的问题是是否有可能inheritance区域没有专门化,所以它不被inheritance为区域的整数,但面积矩形可以专门化的types。

为了理解模版,直接使用术语是非常有好处的,因为你提到的方式决定了思考的方式。

具体而言, Area不是模板类,而是类模板。 也就是说,它是可以生成类的模板。 Area<int>就是这样一个类(它不是一个对象,当然你可以用同样的方法创build一个对象,就像从其他类创build对象一样)。 另一个这样的类将是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时从哪个分类派生。 无论这些类是否由模板生成,都是如此。 相同类的两个对象不能有不同的inheritance层次结构。

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

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

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

这可能是你想要一个单一types的Rectangle以便您可以将各种Rectangle传递给相同的function(本身不需要知道面积types)。 由于通过实例化模板Rectangle生成的Rectangle<T>类在forms上是相互独立的,所以不会这样工作。 不过你可以在这里使用多重inheritance:

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

如果你的genericsRectangle是从一个通用的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> { }; 

使矩形模板,并将types名称传递到区域:

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

Rectangle必须是一个模板,否则它只是一种types 。 它不可能是一个非模板,而它的基础是神奇的。 (它的基础可能是一个模板实例化 ,尽pipe您似乎想要将基础的function作为模板来维护)。

 #include<iostream> using namespace std; template<class t> class base { protected: ta; public: base(t aa){ a = aa; cout<<"base "<<a<<endl; } }; template <class t> class derived: public base<t>{ public: derived(ta): base<t>(a) { } //Here is the method in derived class void sampleMethod() { cout<<"In sample Method"<<endl; } }; int main() { derived<int> q(1); // calling the methods q.sampleMethod(); }