继承自c ++中的模板类

dte*_*ech 91 c++ inheritance templates

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

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

现在我有一个Rectangle继承Area该类的类.由于Rectangle它本身不是模板,我无法输入Rectangle<int>.

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

编辑:对不起,我忘了澄清 - 我的问题是是否可以继承区域而不专门化它,因此它不会作为整数区域继承,但区域矩形可以专门化类型.

cel*_*chk 216

为了理解模板,使术语直截了当是非常有利的,因为你谈论它们的方式决定了思考它们的方式.

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

由于Area不是类,因此无法从中派生类Rectangle.您只能从另一个类(或其中几个)派生一个类.既然Area<int>是一个类,你可以从中派生Rectangle出来:

class Rectangle:
  public Area<int>
{
  // ...
};
Run Code Online (Sandbox Code Playgroud)

由于Area<int>并且Area<char>是不同的类,您甚至可以同时从两个类派生(但是当访问它们的成员时,您将不得不处理歧义):

class Rectangle:
  public Area<int>,
  public Area<char>
{
  // ...
};
Run Code Online (Sandbox Code Playgroud)

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

你能做的就是制作Rectangle一个模板.如果你写

template<typename T> class Rectangle:
  public Area<T>
{
  // ...
};
Run Code Online (Sandbox Code Playgroud)

你有一个模板Rectangle,你可以从中获得一个Rectangle<int>派生自的类Area<int>,以及一个Rectangle<char>派生自的类Area<char>.

可能是您希望拥有单一类型,Rectangle以便您可以将各种类型Rectangle的函数传递给同一个函数(它本身不需要知道区域类型).由于Rectangle<T>通过实例化模板生成的类Rectangle在形式上彼此独立,因此不能以这种方式工作.但是,您可以在此处使用多重继承:

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);
}
Run Code Online (Sandbox Code Playgroud)

如果您的泛型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
};
Run Code Online (Sandbox Code Playgroud)


Stu*_*etz 17

你只是想从中衍生出来Area<int>吗?在这种情况下,你这样做:

class Rectangle : public Area<int>
{
    // ...
};
Run Code Online (Sandbox Code Playgroud)

编辑:在澄清之后,您似乎也在尝试制作Rectangle模板,在这种情况下,以下情况应该有效:

template <typename T>
class Rectangle : public Area<T>
{
    // ...
};
Run Code Online (Sandbox Code Playgroud)


lda*_*nko 8

class Rectangle : public Area<int> {
};
Run Code Online (Sandbox Code Playgroud)


pez*_*ode 8

将Rectangle设为模板并将typename传递给Area:

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

};
Run Code Online (Sandbox Code Playgroud)


小智 7

#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();
}
Run Code Online (Sandbox Code Playgroud)

  • 首先,这是一个非常古老的问题,已经有了很好的答案。其次,请避免只是代码的答案(和问题)。包含详细的解释也很有用。 (7认同)

Lig*_*ica 6

Rectangle必须是一个模板,否则它只是一种类型.它不可能是一个非模板,而它的基础是神奇的.(它的基础可能是模板实例化,但您似乎希望将基础功能保留为模板.)