伍冰枝广东话:关于c++的程序问题 高手请进

来源:百度文库 编辑:杭州交通信息网 时间:2024/04/26 20:58:58
哪里有错误?
#include <iostream>
#include <string>
using namespace std;
class student
{
public:
student(string nam,char s,int no)
{name=nam;
sex=s;
NO=no;
}
protected:
string name;
char sex;
int NO;
};
class birth:public student
{
public:
birth(string nam,char s,int no,int y,int m,int d):student(nam,s,no)
{year=y;
month=m;
day=d;
}
protected:
int year;
int month;
int day;
};
class student1:public student,public birth
{
public:
student1(string nam,char s,int no,int y,int m,int d,string addr,float sco):student(nam,s,no),birth(y,m,d)
{address=addr;
score=sco;
}
private:
string address;
float score;
};
int main()
{
student1 s("wang",'m',122,1999,12,1,"bei ",55.5);

return 0;
}

/*
如果只是简单的改一改错误的话,错误应该在
student1这个类的构造函数当中的,应该改为:
student1(string nam,char s,int no,int y,int m,int d,string addr,float sco):student(nam,s,no),birth(nam,s,no,y,m,d)
也就是将birth(y,m,d)改为birth(nam,s,no,y,m,d)
因为你的birth类当中根本没有传三个参数的构造函数,只有传五个参数的构造函数,所以你一开始编译就会出错原因就在这里.
所以只要改一下,就完全正确了,程序就可以正常运行了。

但是我认为虽然能正常运行但并不代表你的程序就没有问题,你的程序的主要问题出在类的继承层次上面。
你的student类是基类,birth是继承自student类的子类。student1类是继承自student类和birth类的子类,
那么问题就出在student1这个类上,实际上你完全可以只让student1类继承自birth类就万事大吉了,因为birth类
就是从student类继承来的,所以你的student1只要继承自birth,就已经也继承自student类了。
就是将
class student1:public student,public birth
改为
class student1:public birth
这样有很多好处:
第一:它们的功效一样,但第二个更简单.student1都是继承自birth的,而birth是继承自student的
第二:初始化成员变量也更简单了
原来构造函数应该是
student1(string nam,char s,int no,int y,int m,int d,string addr,float sco):student(nam,s,no),birth(nam,s,no,y,m,d)
现在只要是
student1(string nam,char s,int no,int y,int m,int d,string addr,float sco):birth(nam,s,no,y,m,d)
就可以了,此时因为birth类的构造函数已经会默认初始化student类的成员变量了,所以不要再初始化student类了,也就降低了出错的概率。
第三:占用内存空间更少了,原来你的student1占用的内存空间为一个birth类大小加上一个studet类大小再加上studet1自己的成员变量的大小之和。
现在是一个birth类加上student1类的成员变量的大小之和.
第四:程序结构更加清晰紧凑。

好了下面我给出一个经过改进之后的程序,请楼主参考一下,我已经运行成功了,可以直接拷贝过去使用
如果有什么不懂的发我邮箱:ddrmsdos@163.com
*/
#include <iostream>
#include <string>
using namespace std;
class student
{
public:
student(){}//应该写默认构造函数,这是一个好习惯哦
student(string nam,char s,int no)
{name=nam;
sex=s;
NO=no;
}
protected:
string name;
char sex;
int NO;
};
class birth:public student
{
public:
birth(){}//应该写默认构造函数,这是一个好习惯哦
birth(string nam,char s,int no,int y,int m,int d):student(nam,s,no)
{year=y;
month=m;
day=d;
}
protected:
int year;
int month;
int day;
};
class student1:public birth //直接继承自birth就可以了
{
public:
student1(){}//应该写默认构造函数,这是一个好习惯哦
student1(string nam,char s,int no,int y,int m,int d,string addr,float sco):birth(nam,s,no,y,m,d)
{
address=addr;
score=sco;
}
private:
string address;
float score;
};
int main()
{
student1 s("wang",'m',122,1999,12,1,"bei ",55.5);

return 0;
}

俩高手!