类模板继承问题

#include<iostream>usingnamespacestd;template<typenameT1,typenameT2>classpoint{public:... #include<iostream>
using namespace std;
template<typename T1,typename T2>
class point
{
public:
point(T1 x,T2 y);
T1 getx();
T2 gety();
void show();
~point(){};
private:
T1 X;
T2 Y;
};
template<typename T1,typename T2>
point<T1,T2>::point(T1 x,T2 y)
{
X=x;
Y=y;
}
template<typename T1,typename T2>
T1 point<T1,T2>::getx()
{

return X;

}
template<typename T1,typename T2>
T2 point<T1,T2>::gety()
{
return Y;

}
template<typename T1,typename T2>
void point<T1,T2>::show()
{
cout<<"X="<<X<<endl<<"Y="<<Y<<endl;
}
template<typename T1,typename T2>
class rectangle:public point<T1,T2>
{
public:
rectangle(T1 x,T2 y,T1 w,T2 l):X(x),Y(y){W=w;L=l;}
T1 getl(){return L;}
T2 getw(){return W;}
void dispaly(){cout<<"W="<<W<<endl<<"L="<<L<<endl;}
~rectangle(){};
private:
T1 W;
T2 L;
};
void main()
{
point<int,double> *P=new point<int,double>(2,3.3);
P->show();
delete P;
rectangle<int,double> *q=new rectangle<int,double>(1,2.1);
q->dispaly();
delete q;
system("pause");
}

//error C2661: 'rectangle<int,double>::rectangle<int,double>' : no overloaded function takes 2 parameters

看的网上关于类模板自己根据经验写的,第一个类是为了熟悉模版所以比较长,第二个类就简写了,网上关于模版继承问题讲的很简单,不知道如何正确使用继承了,求解!!
把基类构造函数初始化和派生类构造函数弄混了。。。。
派生类构造函数初始化列表
派生类(参数表):基类名(参数表),基类名(参数表){本类初始化}
展开
 我来答
CCZU
推荐于2016-02-13 · TA获得超过240个赞
知道答主
回答量:39
采纳率:0%
帮助的人:47万
展开全部
1、首先说这个问题
//error C2661: 'rectangle<int,double>::rectangle<int,double>' : no overloaded function takes 2 parameters
这个报错是说没有可重载的构造函数overloaded function,必须带两个参数的 takes 2 parameters
就是指基类没有无参的构造函数

是指这一句
rectangle(T1 x,T2 y,T1 w,T2 l):X(x),Y(y){W=w;L=l;}

a、基类构造函数是必须带参数的,没有无参的构造函数,继承类需要声明基类的构造函数
b、基类是模板类,声明基类构造函数时候需要带模板,我打个比方,用继承类的模板参数初始化基类模板
应该改成这样
rectangle(T1 x,T2 y,T1 w,T2 l):point<T1, T2>(x, y), W(x),L(y)

2、继承类rectangle成员变量W、L在这里初始化

X、Y是基类的成员变量,通过point<T1, T2>(x, y) 初始化

构造函数后面冒号以后的成员变量初始化只能初始化当前类的成员变量,基类的无法直接初始化
但是可以在构造函数里面复制

不明白继续问,多问多成长,望采纳
更多追问追答
追问
我记得普通派生类构造函数的初始化列表可以初始化基类数据成员吧
//记错了,是基类名(参数表)—_—
追答
不可以的,你可以试试,编译会报错的
构造函数冒号后面的成员变量初始化比较特殊,是在分配内存时候就将这个变量赋初值,基类成员变量的内存在基类构造时候创建,继承类创建自己的成员变量,这个具体可以参考钱能的C++,对于类的地址空间中有相关描述

要给基类成员变量赋值,一种是通过调用基类构造函数,第二种可以在继承类构造函数中赋值,继承类初始化列表是真心不行
百度网友b2cf957
2012-07-21 · TA获得超过592个赞
知道小有建树答主
回答量:131
采纳率:0%
帮助的人:147万
展开全部
class rectangle的定义中:
构造函数
rectangle(T1 x,T2 y,T1 w,T2 l):X(x),Y(y){W=w;L=l;}

接收四个参数

而 main函数中
rectangle<int,double> *q=new rectangle<int,double>(1,2.1);

只传入了两个参数
所以编译不通过

error C2661: 'rectangle<int,double>::rectangle<int,double>' : no overloaded function takes 2 parameters

说的是rectangle这个类的构造函数不接受只有两个参数的调用
追问
我知道要四个参数,我也改成过四个参数,不过会出现一大堆的错误,rectangle(T1 x,T2 y,T1 w,T2 l):X(x),Y(y){W=w;L=l;}好像错误了,改成二楼的rectangle( T1 x,T2 y,T1 w,T2 l ) : point( x, y ) { W = w; L = l; }就没问题了
追答
嗯,2楼说的的确明白
本回答被网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
匿名用户
2012-07-21
展开全部
rectangle(T1 x,T2 y,T1 w,T2 l):X(x),Y(y){W=w;L=l;}
改为:
rectangle( T1 x,T2 y,T1 w,T2 l ) : point( x, y ) { W = w; L = l; }

rectangle<int,double> *q=new rectangle<int,double>(1,2.1);
改为:
rectangle<int, double> * q = new rectangle<int, double>( 2, 3.3, 1, 2.1 );
追问
rectangle(T1 x,T2 y,T1 w,T2 l):X(x),Y(y){W=w;L=l;}这样写为什么不行呢??
追答
派生类不能直接初始化基类成员,需使用基类的构造函数,又因为你所定义的 ponit 类没有默认构造函数,所以必须显式调用 point 类的构造函数。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(1)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式