2012-01-10 94 views
52

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

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

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

如何专门为Rectangle对象继承Area类型?

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

+1

它是_class template_,因为它是从中生成类的模板。 – sbi 2012-01-10 20:48:47

回答

138

对于理解模板,它的巨大优势获得术语直,因为你谈论t时的方式下摆决定了思考他们的方式。

具体而言,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从中可以得到一个类Rectangle<int>Area<int>派生,而不同的类Rectangle<char>Area<char>派生。

它可能是你想要一个单一的类型Rectangle,以便您可以将各种各样的Rectangle传递给相同的功能(本身不需要知道面积类型)。由于通过实例化模板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 
}; 
4

Rectangle将必须是一个模板,否则它是只是一种类型。它不可能是一个非模板,而它的基础是神奇的。 (其基础可能是一个模板实例,但你似乎想维持基本的功能作为模板

7
class Rectangle : public Area<int> { 
}; 
10

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

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

编辑:继澄清,看来你实际上是试图使Rectangle模板,以及,在这种情况下,下面应该工作:

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

使矩形模板,通过类型名称上区:

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

}; 
0
#include<iostream> 

using namespace std; 

template<class t> 
class base { 
protected: 
    t a; 
public: 
    base(t aa){ 
     a = aa; 
     cout<<"base "<<a<<endl; 
    } 
}; 

template <class t> 
class derived: public base<t>{ 
    public: 
     derived(t a): 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(); 
} 
+0

如果派生类中有方法,该怎么办?你会如何定义它们?至少对于我来说,大部分都是导入的,你怎么在main()函数中调用/使用这些方法? – Pototo 2017-06-02 22:44:12

+0

您的问题的答案是在代码 – 2017-06-03 06:00:35

+2

首先,这是一个非常古老的问题,已经有一个很好的答案。其次,请避免只有代码的答案(和问题)。包含详细解释也很有用。 – marcman 2017-07-08 20:02:33