例11.1 访问公有基类的成员。
下面写出类的声明部分:
Class Student//声明基类
{public: //基类公用成员
voidget_value( )
{cin>>num>>name>>sex;}
voiddisplay( )
{cout<<" num: "<<num<<endl;
cout<<" name: "<<name<<endl;
cout<<" sex: "<<sex<<endl;}
private: //基类私有成员
intnum;
string name;
charsex;
};
classStudent1: publicStudent //以public方式声明派生类Student1
{public:
voiddisplay_1( )
{cout<<" num: "<<num<<endl; //企图引用基类的私有成员,错误
cout<<" name: "<<name<<endl; //企图引用基类的私有成员,错误
cout<<" sex: "<<sex<<endl; //企图引用基类的私有成员,错误
cout<<" age: "<<age<<endl; //引用派生类的私有成员,正确
cout<<" address: "<<addr<<endl;} //引用派生类的私有成员,正确
private:
intage;
string addr;
};
例11.10 定义一个基类Student(学生),再定义Student类的公用派生类Graduate(研究生),用指向基类对象的指针输出数据。
本例主要是说明用指向基类对象的指针指向派生类对象,为了减少程序长度,在每个类中只设很少成员。学生类只设num(学号),name(名字)和score(成绩)3个数据成员,Graduate类只增加一个数据成员pay(工资)。程序如下:
#include <iostream>
#include <string>
usingnamespacestd;
classStudent//声明Student类
{public:
Student(int, string,float); //声明构造函数
voiddisplay( ); //声明输出函数
private:
intnum;
string name;
floatscore;
};
Student::Student(intn, string nam,floats) //定义构造函数
{num=n;
name=nam;
score=s;
}
voidStudent::display( ) //定义输出函数
{cout<<endl<<"num:"<<num<<endl;
cout<<"name:"<<name<<endl;
cout<<"score:"<<score<<endl;
}
classGraduate:publicStudent //声明公用派生类Graduate
{public:
Graduate(int, string ,float,float); //声明构造函数
voiddisplay( ); //声明输出函数
private:
floatpay; //工资
};
Graduate::Graduate(intn, string nam,floats,floatp):Student(n,nam,s),pay(p){ }
//定义构造函数
voidGraduate::display() //定义输出函数
{Student::display(); //调用Student类的display函数
cout<<"pay="<<pay<<endl;
}
intmain()
{Student stud1(1001,"Li",87.5); //定义Student类对象stud1
Graduate grad1(2001,"Wang",98.5,563.5); //定义Graduate类对象grad1
Student *pt=&stud1;//定义指向Student类对象的指针并指向stud1
pt->display( ); //调用stud1.display函数
pt=&grad1; //指针指向grad1
pt->display( ); //调用grad1.display函数
}
例11.2 将例11.1中的公用继承方式改为用私有继承方式(基类Student不改)。
可以写出私有派生类如下:
classStudent1: privateStudent//用私有继承方式声明派生类Student1
{public:
voiddisplay_1( ) //输出两个数据成员的值
{cout<<"age: "<<age<<endl; //引用派生类的私有成员,正确
cout<<"address: "<<addr<<endl;} //引用派生类的私有成员,正确
private:
intage;
string addr;
};请分析下面的主函数:intmain( )
{Student1 stud1;//定义一个Student1类的对象stud1
stud1.display(); //错误,私有基类的公用成员函数在派生类中是私有函数
stud1.display_1( ); //正确。Display_1函数是Student1类的公用函数
stud1.age=18; //错误。外界不能引用派生类的私有成员
return0;
}
例11.3 在派生类中引用保护成员。
#include <iostream>
#include <string>
usingnamespacestd;
classStudent//声明基类
{public: //基类公用成员
voiddisplay( );
protected: //基类保护成员
intnum;
string name;
charsex;
};
voidStudent::display( ) //定义基类成员函数
{cout<<"num: "<<num<<endl;
cout<<"name: "<<name<<endl;
cout<<"sex: "<<sex<<endl;
}
classStudent1: protectedStudent //用protected方式声明派生类Student1
{public:
voiddisplay1( ); //派生类公用成员函数
private:
intage; //派生类私有数据成员
string addr; //派生类私有数据成员
};
voidStudent1::display1( ) //定义派生类公用成员函数
{cout<<"num: "<<num<<endl; //引用基类的保护成员,合法
cout<<"name: "<<name<<endl; //引用基类的保护成员,合法
cout<<"sex: "<<sex<<endl; //引用基类的保护成员,合法
cout<<"age: "<<age<<endl; //引用派生类的私有成员,合法
cout<<"address: "<<addr<<endl; //引用派生类的私有成员,合法
}
intmain( )
{Student1 stud1; //stud1是派生类Student1类的对象
stud1.display1( ); //合法,display1是派生类中的公用成员函数
stud1.num=10023; //错误,外界不能访问保护成员
return0;
}
例11.4 多级派生的访问属性。
如果声明了以下的类:
classA//基类
{public:
inti;
protected:
voidf2( );
intj;
private:
intk;
};
classB: publicA //public方式
{public:
voidf3( );
protected:
voidf4( );
private:
intm;
};
classC: protectedB //protected方式
{public:
voidf5( );
private:
intn;
};
例11.5 简单的派生类的构造函数。
#include <iostream>
#include<string>
usingnamespacestd;
classStudent//声明基类Student
{public:
Student(intn,string nam,chars) //基类构造函数
{num=n;
name=nam;
sex=s; }
~Student( ){ } //基类析构函数
protected: //保护部分
intnum;
string name;
charsex ;
};
classStudent1: publicStudent //声明派生类Student1
{public: //派生类的公用部分
Student1(intn,string nam,chars,inta,string ad):Student(n,nam,s)
//派生类构造函数
{age=a; //在函数体中只对派生类新增的数据成员初始化
addr=ad;
}
voidshow( )
{cout<<"num: "<<num<<endl;
cout<<"name: "<<name<<endl;
cout<<"sex: "<<sex<<endl;
cout<<"age: "<<age<<endl;
cout<<"address: "<<addr<<endl<<endl;
}
~Student1( ){ } //派生类析构函数
private: //派生类的私有部分
intage;
string addr;
};
intmain( )
{Student1 stud1(10010,"Wang-li",'f',19,"115 Beijing Road,Shanghai");
Student1 stud2(10011,"Zhang-fun",'m',21,"213 Shanghai Road,Beijing");
stud1.show( ); //输出第一个学生的数据
stud2.show( ); //输出第二个学生的数据
return0;
}
例11.6 包含子对象的派生类的构造函数。
为了简化程序以易于阅读,这里设基类Student的数据成员只有两个,即num和name。
#include <iostream>
#include <string>
usingnamespacestd;
classStudent//声明基类
{public: //公用部分
Student(intn, string nam ) //基类构造函数,与例11.5相同
{num=n;
name=nam;
}
voiddisplay( ) //成员函数,输出基类数据成员
{cout<<"num:"<<num<<endl<<"name:"<<name<<endl;}
protected: //保护部分
intnum;
string name;
};
classStudent1: publicStudent //声明公用派生类Student1
{public:
Student1(intn, string nam,intn1, string nam1,inta, string ad)
:Student(n,nam),monitor(n1,nam1) //派生类构造函数
{age=a;
addr=ad;
}
voidshow( )
{cout<<"This student is:"<<endl;
display(); //输出num和name
cout<<"age: "<<age<<endl; //输出age
cout<<"address: "<<addr<<endl<<endl; //输出addr
}
voidshow_monitor( ) //成员函数,输出子对象
{cout<<endl<<"Class monitor is:"<<endl;
monitor.display( ); //调用基类成员函数
}
private: //派生类的私有数据
Student monitor; //定义子对象(班长)
intage;
string addr;
};
intmain( )
{Student1 stud1(10010,"Wang-li",10001,"Li-sun",19,"115 Beijing Road,Shanghai");
stud1.show( ); //输出学生的数据
stud1.show_monitor(); //输出子对象的数据
return0;
}
例11.7 多级派生情况下派生类的构造函数。
#include <iostream>
#include<string>
usingnamespacestd;
classStudent//声明基类
{public: //公用部分
Student(intn, string nam ) //基类构造函数
{num=n;
name=nam;
}
voiddisplay( ) //输出基类数据成员
{cout<<"num:"<<num<<endl;
cout<<"name:"<<name<<endl;
}
protected: //保护部分
intnum; //基类有两个数据成员
string name;
};
classStudent1: publicStudent //声明公用派生类Student1
{public:
Student1(intn,charnam[10],inta):Student(n,nam)//派生类构造函数
{age=a; } //在此处只对派生类新增的数据成员初始化
voidshow( ) //输出num,name和age
{display( ); //输出num和name
cout<<"age: "<<age<<endl;
}
private: //派生类的私有数据
intage; //增加一个数据成员
};
classStudent2:publicStudent1 //声明间接公用派生类Student2
{public:
//下面是间接派生类构造函数
Student2(intn, string nam,inta,ints):Student1(n,nam,a)
{score=s;}
voidshow_all( ) //输出全部数据成员
{show( ); //输出num和name
cout<<"score:"<<score<<endl; //输出age
}
private:
intscore; //增加一个数据成员
};
intmain( )
{Student2 stud(10010,"Li",17,89);
stud.show_all( ); //输出学生的全部数据
return0;
}
例11.8 声明一个教师(Teacher)类和一个学生(Student)类,用多重继承的方式声明一个研究生(Graduate)派生类。教师类中包括数据成员name(姓名)、age(年龄)、title(职称)。学生类中包括数据成员name1(姓名)、age(性别)、score(成绩)。在定义派生类对象时给出初始化的数据,然后输出这些数据。
#include <iostream>
#include <string>
usingnamespacestd;
classTeacher//声明类Teacher(教师)
{public: //公用部分
Teacher(string nam,inta, string t) //构造函数
{name=nam;
age=a;
title=t;}
voiddisplay( ) //输出教师有关数据
{cout<<"name:"<<name<<endl;
cout<<"age"<<age<<endl;
cout<<"title:"<<title<<endl;
}
protected: //保护部分
string name;
intage;
string title; //职称
};
classStudent //定义类Student(学生)
{public:
Student(charnam[],chars,floatsco)
{strcpy(name1,nam);
sex=s;
score=sco;} //构造函数
voiddisplay1( ) //输出学生有关数据
{cout<<"name:"<<name1<<endl;
cout<<"sex:"<<sex<<endl;
cout<<"score:"<<score<<endl;
}
protected: //保护部分
string name1;
charsex;
floatscore; //成绩
};
classGraduate:publicTeacher,publicStudent //声明多重继承的派生类Graduate
{public:
Graduate(string nam,inta,chars, string t,floatsco,floatw):
Teacher(nam,a,t),Student(nam,s,sco),wage(w) { }
voidshow( ) //输出研究生的有关数据
{cout<<"name:"<<name<<endl;
cout<<"age:"<<age<<endl;
cout<<"sex:"<<sex<<endl;
cout<<"score:"<<score<<endl;
cout<<"title:"<<title<<endl;
cout<<"wages:"<<wage<<endl;
}
private:
floatwage; //工资
};
intmain( )
{Graduate grad1("Wang-li",24,'f',"assistant",89.5,1234.5);
grad1.show( );
return0;
}
例11.9 在例11.8的基础上,在Teacher类和Student类之上增加一个共同的基类Person,如图11.25所示。作为人员的一些基本数据都放在Person中,在Teacher类和Student类中再增加一些必要的数据。
#include <iostream>
#include <string>
usingnamespacestd;
//声明公共基类Person
classPerson
{public:
Person(string nam,chars,inta)//构造函数
{name=nam;sex=s;age=a;}
protected: //保护成员
string name;
charsex;
intage;
};
//声明Person的直接派生类Teacher
classTeacher:virtualpublicPerson //声明Person为公用继承的虚基类
{public:
Teacher(string nam,chars,inta, string t):Person(nam,s,a)//构造函数
{title=t;
}
protected: //保护成员
string title; //职称
};
//声明Person的直接派生类Student
classStudent:virtualpublicPerson //声明Person为公用继承的虚基类
{public:
Student(string nam,chars,inta,floatsco) //构造函数
:Person(nam,s,a),score(sco){ } //初始化表
protected: //保护成员
floatscore; //成绩
};
//声明多重继承的派生类Graduate
classGraduate:publicTeacher,publicStudent //Teacher和Student为直接基类
{public:
Graduate(string nam,chars,inta, string t,floatsco,floatw)//构造函数
:Person(nam,s,a),Teacher(nam,s,a,t),Student(nam,s,a,sco),wage(w){}
//初始化表
voidshow( ) //输出研究生的有关数据
{cout<<"name:"<<name<<endl;
cout<<"age:"<<age<<endl;
cout<<"sex:"<<sex<<endl;
cout<<"score:"<<score<<endl;
cout<<"title:"<<title<<endl;
cout<<"wages:"<<wage<<endl;
}
private:
floatwage; //工资
};
//主函数
intmain( )
{Graduate grad1("Wang-li",'f',24,"assistant",89.5,1234.5);
grad1.show( );
return0;
}