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)
将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)