关于派生类的构造函数
#include"iostream"
#include"cstring"
using namespace std;
class person
{
public:
person(int stu_id,char *stu_name)
{
id=stu_id;
strcpy(name,stu_name);
}
void show()
{
cout<<"Id: "<<id<<" name: "<<name;
}
void set(int newid,char *newname)
{
id=newid;
strcpy(name,newname);
}
private:
char name[20];
int id;
};
class student:protected person
{
public:
student();//应该是这里构造函数出错
void stu_join(char *newname,int new_id,int newgrad_id,int newpoint)
{
person::set(new_id,newname);
grad_id=new_id;
point=newpoint;
}
void show()
{
person::show();
cout<<"point: "<<point<<" "<<"grad_id: "<<grad_id;
}
void stu_get()
{
cin>>point>>grad_id;
}
private:
int point;
int grad_id;
};
void main()
{
student stu1;
stu1.stu_join("wangd",1325,200313,100);
stu1.show();
}
/*1. 如果自己不定义构造函数系统会自动生成构造函数,但是在这里我如果不自定义构造函数
系统会报错 为什么?
2.在下对派生类的构造函数自定义不太明白,哪位大侠能指点迷津感激不尽*/
问题点数:10、回复次数:6Top
1 楼oosky2004(我要好东西)回复于 2005-11-15 08:57:54 得分 2
第一,student是person的派生,既然person已经定义了构造函数,当然你的student构造的时候就要person的构造。student调用默认的构造函数,person的构造调用失败,所以报错。
第二,还是看看书。Top
2 楼dalish200(dalish200)回复于 2005-11-15 12:04:53 得分 0
第一,student是person的派生,既然person已经定义了构造函数,当然你的student构造的时候就要person的构造。student调用默认的构造函数,person的构造调用失败,所以报错。
-----------------------------------------------------------------------------------
谢谢oosky2004(oosky)兄的指点!
但是应该不关基类的事吧,派生类怎么能对基类有所要求,再说新类是不会继承基类的构造函数和析构函数的.而且我试了一下即使基类也用默认的构造函数也只能通过编译不能通过连接Top
3 楼fflush(stdin)回复于 2005-11-15 12:35:29 得分 5
1. 如果自己不定义构造函数系统会自动生成构造函数,但是在这里我如果不自定义构造函数
系统会报错 为什么?
首先不说继承的问题,如果你定义了一个类,但是没有显式定义构造函数,会出现如下的情况:
(1)类成员都是内置类型,如int, char等,编译器什么都不做,类成员处于未初始化状态
(2)类成员有其他的类对象,并且该类对象有一个不需要参数的构造函数(默认构造函数),编译器为你的类自动构造一个构造函数,在里面他会调用类对象的构造函数,你的类里面含有一个string对象就是这样的例子
(3)类成员有其他的类对象,但是该类对象没有不含参数的构造函数,此时编译器将报错,因为这个类对象无法正确的构造
在回答你的问题之前,说明一下,如果你不为一个类写构造函数(如果通过编译的话),那么可以认为它有一个默认的构造函数(说法不太准确,此时编译器不一定会自动生成),但如果你写了一个带参数的构造函数(必须提供参数,那些有参数,但都有默认值的不算),同时没有提供一个不要参数的版本,你的类就没有默认的构造函数。
最后指出,继承的情况和上面提到的组合的情况一样,自己好好想想就知道你为什么错了Top
4 楼wohow()回复于 2005-11-15 13:35:33 得分 2
楼主的错误在于说明了student的构造函数但是没有定义。在main()中
student stu1;
需要调用student::student(),在类中有声明,所以编译通过,但是没有student::student()函数的定义,所以链接时出错。Top
5 楼whatsouta(某疯子)回复于 2005-11-15 14:02:11 得分 1
同意楼上Top
6 楼dalish200(dalish200)回复于 2005-11-15 22:41:24 得分 0
谢谢各位在下知道错在哪里了Top




