问题描述:
类person派生出类student和类teacher,其中student类派生出类graduate类和undergraduate类。用各种方法建立类对象,并统计各类对象的个数。
代码如下:
#include<iostream>
using namespace std;
class person
{ //定义person类 其中私有成员数据id
private:
int id; //人物编号
static int numberp; //静态数据成员 记录person类对象的个数
public:
person(int id=0)
{
this->id = id;
numberp++;
}
person(person &p)
{
id = p.id;
numberp++;
}
void datap() //用来输出person类的私有数据成员
{
cout << "person编号为:" << id << endl;
}
void showp() //用来输出person类对象的个数
{
cout << "person类对象的个数为:" << numberp << endl;
}
~person()
{
}
};
int person::numberp = 0;
class student : public person
{ //定义student类,由person类派生出 其中私有成员数据ids
private:
int ids; //表示学生学号
static int numbers; //记录student类的个数
public:
student(int ids=0,int id=0) : person(id)
{
this->ids = ids;
numbers++;
}
student(student &s)
{
ids = s.ids;
numbers++;
}
void datas()
{
cout << "student学号为:" << ids << endl;
}
void shows()
{
cout << "student类对象的个数为:" << numbers << endl;
}
~student()
{
}
};
int student::numbers = 0;
class teacher : public person
{ //定义teacher类,由类person派生出 其中私有数据成员idt
private:
int idt; //表示教师的工号
static int numbert; //记录teacher类的个数
public:
teacher(int idt=0,int id=0) : person(id)
{
this->idt = idt;
numbert++;
}
teacher(teacher &t)
{
idt = t.idt;
numbert++;
}
void datat() //展示teacher类的私有成员数据
{
cout << "teacher工号为:" << idt << endl;
}
void showt() //展示teacher类对象的个数
{
cout << "teacher类对象的个数为:" << numbert << endl;
}
~teacher()
{
}
};
int teacher::numbert = 0;
class graduate : public student
{ //定义graduate类,是由student类派生出,而student类是由person类派生出
private:
int idg; //graduate类的私有数据成员
static int numberg; //用于记录graduate类对象的个数
public:
graduate(int idg = 0, int ids = 0, int id = 0) : student(ids,id)
{
this->idg = idg;
numberg++;
}
graduate(graduate &g)
{
idg = g.idg;
numberg++;
}
void datag()
{
cout << "graduate学号为:" << idg << endl;
}
void showg() //用于显示graduate类对象的个数
{
cout << "graduate类对象的个数为:" << numberg << endl;
}
~graduate()
{
}
};
int graduate::numberg = 0;
class undergraduate : public student
{ //定义undergraduate类,是由student类派生出,而student类是由person类派生出
private:
int idu; //undergraduate类的私有数据成员
static int numberu; //用于记录undergraduate类对象的个数
public:
undergraduate(int idu, int ids, int id) : student(ids, id)
{
this->idu = idu;
numberu++;
}
undergraduate(undergraduate &u)
{
idu = u.idu;
numberu++;
}
void datau()
{
cout << "undergraduate学号为:" << idu << endl;
}
void showu()
{
cout << "undergraduate类对象的个数为:" << numberu << endl;
}
~undergraduate()
{
}
};
int undergraduate::numberu = 0;
int main()
{
person p1(12);
cout << "建立person类对象1后" << endl;
p1.showp();
person p2(p1);
cout << "建立person类对象2后(利用person类对象对其进行赋值)" << endl;
p2.showp();
student s1(12,34);
cout << "建立student类对象1后" << endl;
s1.showp();
s1.shows();
student s2(s1);
cout << "建立student类对象2后(利用student类对象对其进行赋值)" << endl;
s2.showp();
s2.shows();
teacher t1(23, 22);
cout << "建立teacher类对象后" << endl;
t1.showp();
t1.showt();
graduate g1(13, 24, 45);
cout << "建立graduate类对象1后" << endl;
g1.showp();
g1.shows();
g1.showg();
graduate g2(g1);
cout << "建立graduate类对象2后(利用graduate对象给其赋值)" << endl;
g2.showp();
g2.shows();
g2.showg();
undergraduate u1(23, 33, 44);
cout << "建立undergraduate类对象后" << endl;
u1.showp();
u1.shows();
u1.showu();
person p3(s1);
cout << "建立person类对象3后(利用student对象给其初始化)" << endl;
p3.showp();
}
问题总结:
对于派生类和基类的关系,派生类继承了基类的成员数据(函数),又可能增添了新的数据成员(函数),所以派生类包含基类。少的(基类)调用多的(派生类)没问题,但是反过来就可能会有问题。
对于静态成员数据,多个对象都可调用,但是不同对象中的静态成员数据占用同一个内存空间。改变一个,其余的都会变。必须类里面定义,类外边初始化。
对于派生类的构造函数和拷贝构造函数,函数体中只用对派生类新加的成员数据进行处理即可。