例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; //企圖引用基類的私有成員,錯(cuò)誤
cout<<" name: "<<name<<endl; //企圖引用基類的私有成員,錯(cuò)誤
cout<<" sex: "<<sex<<endl; //企圖引用基類的私有成員,錯(cuò)誤
cout<<" age: "<<age<<endl; //引用派生類的私有成員,正確
cout<<" address: "<<addr<<endl;} //引用派生類的私有成員,正確
private:
intage;
string addr;
};
例11.10 定義一個(gè)基類Student(學(xué)生),再定義Student類的公用派生類Graduate(研究生),用指向基類對(duì)象的指針輸出數(shù)據(jù)。
本例主要是說明用指向基類對(duì)象的指針指向派生類對(duì)象,為了減少程序長(zhǎng)度,在每個(gè)類中只設(shè)很少成員。學(xué)生類只設(shè)num(學(xué)號(hào)),name(名字)和score(成績(jī))3個(gè)數(shù)據(jù)成員,Graduate類只增加一個(gè)數(shù)據(jù)成員pay(工資)。程序如下:
#include <iostream>
#include <string>
usingnamespacestd;
classStudent//聲明Student類
{public:
Student(int, string,float); //聲明構(gòu)造函數(shù)
voiddisplay( ); //聲明輸出函數(shù)
private:
intnum;
string name;
floatscore;
};
Student::Student(intn, string nam,floats) //定義構(gòu)造函數(shù)
{num=n;
name=nam;
score=s;
}
voidStudent::display( ) //定義輸出函數(shù)
{cout<<endl<<"num:"<<num<<endl;
cout<<"name:"<<name<<endl;
cout<<"score:"<<score<<endl;
}
classGraduate:publicStudent //聲明公用派生類Graduate
{public:
Graduate(int, string ,float,float); //聲明構(gòu)造函數(shù)
voiddisplay( ); //聲明輸出函數(shù)
private:
floatpay; //工資
};
Graduate::Graduate(intn, string nam,floats,floatp):Student(n,nam,s),pay(p){ }
//定義構(gòu)造函數(shù)
voidGraduate::display() //定義輸出函數(shù)
{Student::display(); //調(diào)用Student類的display函數(shù)
cout<<"pay="<<pay<<endl;
}
intmain()
{Student stud1(1001,"Li",87.5); //定義Student類對(duì)象stud1
Graduate grad1(2001,"Wang",98.5,563.5); //定義Graduate類對(duì)象grad1
Student *pt=&stud1;//定義指向Student類對(duì)象的指針并指向stud1
pt->display( ); //調(diào)用stud1.display函數(shù)
pt=&grad1; //指針指向grad1
pt->display( ); //調(diào)用grad1.display函數(shù)
}
例11.2 將例11.1中的公用繼承方式改為用私有繼承方式(基類Student不改)。
可以寫出私有派生類如下:
classStudent1: privateStudent//用私有繼承方式聲明派生類Student1
{public:
voiddisplay_1( ) //輸出兩個(gè)數(shù)據(jù)成員的值
{cout<<"age: "<<age<<endl; //引用派生類的私有成員,正確
cout<<"address: "<<addr<<endl;} //引用派生類的私有成員,正確
private:
intage;
string addr;
};請(qǐng)分析下面的主函數(shù):intmain( )
{Student1 stud1;//定義一個(gè)Student1類的對(duì)象stud1
stud1.display(); //錯(cuò)誤,私有基類的公用成員函數(shù)在派生類中是私有函數(shù)
stud1.display_1( ); //正確。Display_1函數(shù)是Student1類的公用函數(shù)
stud1.age=18; //錯(cuò)誤。外界不能引用派生類的私有成員
return0;
}
例11.3 在派生類中引用保護(hù)成員。
#include <iostream>
#include <string>
usingnamespacestd;
classStudent//聲明基類
{public: //基類公用成員
voiddisplay( );
protected: //基類保護(hù)成員
intnum;
string name;
charsex;
};
voidStudent::display( ) //定義基類成員函數(shù)
{cout<<"num: "<<num<<endl;
cout<<"name: "<<name<<endl;
cout<<"sex: "<<sex<<endl;
}
classStudent1: protectedStudent //用protected方式聲明派生類Student1
{public:
voiddisplay1( ); //派生類公用成員函數(shù)
private:
intage; //派生類私有數(shù)據(jù)成員
string addr; //派生類私有數(shù)據(jù)成員
};
voidStudent1::display1( ) //定義派生類公用成員函數(shù)
{cout<<"num: "<<num<<endl; //引用基類的保護(hù)成員,合法
cout<<"name: "<<name<<endl; //引用基類的保護(hù)成員,合法
cout<<"sex: "<<sex<<endl; //引用基類的保護(hù)成員,合法
cout<<"age: "<<age<<endl; //引用派生類的私有成員,合法
cout<<"address: "<<addr<<endl; //引用派生類的私有成員,合法
}
intmain( )
{Student1 stud1; //stud1是派生類Student1類的對(duì)象
stud1.display1( ); //合法,display1是派生類中的公用成員函數(shù)
stud1.num=10023; //錯(cuò)誤,外界不能訪問保護(hù)成員
return0;
}
例11.4 多級(jí)派生的訪問屬性。
如果聲明了以下的類:
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 簡(jiǎn)單的派生類的構(gòu)造函數(shù)。
#include <iostream>
#include<string>
usingnamespacestd;
classStudent//聲明基類Student
{public:
Student(intn,string nam,chars) //基類構(gòu)造函數(shù)
{num=n;
name=nam;
sex=s; }
~Student( ){ } //基類析構(gòu)函數(shù)
protected: //保護(hù)部分
intnum;
string name;
charsex ;
};
classStudent1: publicStudent //聲明派生類Student1
{public: //派生類的公用部分
Student1(intn,string nam,chars,inta,string ad):Student(n,nam,s)
//派生類構(gòu)造函數(shù)
{age=a; //在函數(shù)體中只對(duì)派生類新增的數(shù)據(jù)成員初始化
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( ){ } //派生類析構(gòu)函數(shù)
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( ); //輸出第一個(gè)學(xué)生的數(shù)據(jù)
stud2.show( ); //輸出第二個(gè)學(xué)生的數(shù)據(jù)
return0;
}
例11.6 包含子對(duì)象的派生類的構(gòu)造函數(shù)。
為了簡(jiǎn)化程序以易于閱讀,這里設(shè)基類Student的數(shù)據(jù)成員只有兩個(gè),即num和name。
#include <iostream>
#include <string>
usingnamespacestd;
classStudent//聲明基類
{public: //公用部分
Student(intn, string nam ) //基類構(gòu)造函數(shù),與例11.5相同
{num=n;
name=nam;
}
voiddisplay( ) //成員函數(shù),輸出基類數(shù)據(jù)成員
{cout<<"num:"<<num<<endl<<"name:"<<name<<endl;}
protected: //保護(hù)部分
intnum;
string name;
};
classStudent1: publicStudent //聲明公用派生類Student1
{public:
Student1(intn, string nam,intn1, string nam1,inta, string ad)
:Student(n,nam),monitor(n1,nam1) //派生類構(gòu)造函數(shù)
{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( ) //成員函數(shù),輸出子對(duì)象
{cout<<endl<<"Class monitor is:"<<endl;
monitor.display( ); //調(diào)用基類成員函數(shù)
}
private: //派生類的私有數(shù)據(jù)
Student monitor; //定義子對(duì)象(班長(zhǎng))
intage;
string addr;
};
intmain( )
{Student1 stud1(10010,"Wang-li",10001,"Li-sun",19,"115 Beijing Road,Shanghai");
stud1.show( ); //輸出學(xué)生的數(shù)據(jù)
stud1.show_monitor(); //輸出子對(duì)象的數(shù)據(jù)
return0;
}
例11.7 多級(jí)派生情況下派生類的構(gòu)造函數(shù)。
#include <iostream>
#include<string>
usingnamespacestd;
classStudent//聲明基類
{public: //公用部分
Student(intn, string nam ) //基類構(gòu)造函數(shù)
{num=n;
name=nam;
}
voiddisplay( ) //輸出基類數(shù)據(jù)成員
{cout<<"num:"<<num<<endl;
cout<<"name:"<<name<<endl;
}
protected: //保護(hù)部分
intnum; //基類有兩個(gè)數(shù)據(jù)成員
string name;
};
classStudent1: publicStudent //聲明公用派生類Student1
{public:
Student1(intn,charnam[10],inta):Student(n,nam)//派生類構(gòu)造函數(shù)
{age=a; } //在此處只對(duì)派生類新增的數(shù)據(jù)成員初始化
voidshow( ) //輸出num,name和age
{display( ); //輸出num和name
cout<<"age: "<<age<<endl;
}
private: //派生類的私有數(shù)據(jù)
intage; //增加一個(gè)數(shù)據(jù)成員
};
classStudent2:publicStudent1 //聲明間接公用派生類Student2
{public:
//下面是間接派生類構(gòu)造函數(shù)
Student2(intn, string nam,inta,ints):Student1(n,nam,a)
{score=s;}
voidshow_all( ) //輸出全部數(shù)據(jù)成員
{show( ); //輸出num和name
cout<<"score:"<<score<<endl; //輸出age
}
private:
intscore; //增加一個(gè)數(shù)據(jù)成員
};
intmain( )
{Student2 stud(10010,"Li",17,89);
stud.show_all( ); //輸出學(xué)生的全部數(shù)據(jù)
return0;
}
例11.8 聲明一個(gè)教師(Teacher)類和一個(gè)學(xué)生(Student)類,用多重繼承的方式聲明一個(gè)研究生(Graduate)派生類。教師類中包括數(shù)據(jù)成員name(姓名)、age(年齡)、title(職稱)。學(xué)生類中包括數(shù)據(jù)成員name1(姓名)、age(性別)、score(成績(jī))。在定義派生類對(duì)象時(shí)給出初始化的數(shù)據(jù),然后輸出這些數(shù)據(jù)。
#include <iostream>
#include <string>
usingnamespacestd;
classTeacher//聲明類Teacher(教師)
{public: //公用部分
Teacher(string nam,inta, string t) //構(gòu)造函數(shù)
{name=nam;
age=a;
title=t;}
voiddisplay( ) //輸出教師有關(guān)數(shù)據(jù)
{cout<<"name:"<<name<<endl;
cout<<"age"<<age<<endl;
cout<<"title:"<<title<<endl;
}
protected: //保護(hù)部分
string name;
intage;
string title; //職稱
};
classStudent //定義類Student(學(xué)生)
{public:
Student(charnam[],chars,floatsco)
{strcpy(name1,nam);
sex=s;
score=sco;} //構(gòu)造函數(shù)
voiddisplay1( ) //輸出學(xué)生有關(guān)數(shù)據(jù)
{cout<<"name:"<<name1<<endl;
cout<<"sex:"<<sex<<endl;
cout<<"score:"<<score<<endl;
}
protected: //保護(hù)部分
string name1;
charsex;
floatscore; //成績(jī)
};
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( ) //輸出研究生的有關(guān)數(shù)據(jù)
{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的基礎(chǔ)上,在Teacher類和Student類之上增加一個(gè)共同的基類Person,如圖11.25所示。作為人員的一些基本數(shù)據(jù)都放在Person中,在Teacher類和Student類中再增加一些必要的數(shù)據(jù)。
#include <iostream>
#include <string>
usingnamespacestd;
//聲明公共基類Person
classPerson
{public:
Person(string nam,chars,inta)//構(gòu)造函數(shù)
{name=nam;sex=s;age=a;}
protected: //保護(hù)成員
string name;
charsex;
intage;
};
//聲明Person的直接派生類Teacher
classTeacher:virtualpublicPerson //聲明Person為公用繼承的虛基類
{public:
Teacher(string nam,chars,inta, string t):Person(nam,s,a)//構(gòu)造函數(shù)
{title=t;
}
protected: //保護(hù)成員
string title; //職稱
};
//聲明Person的直接派生類Student
classStudent:virtualpublicPerson //聲明Person為公用繼承的虛基類
{public:
Student(string nam,chars,inta,floatsco) //構(gòu)造函數(shù)
:Person(nam,s,a),score(sco){ } //初始化表
protected: //保護(hù)成員
floatscore; //成績(jī)
};
//聲明多重繼承的派生類Graduate
classGraduate:publicTeacher,publicStudent //Teacher和Student為直接基類
{public:
Graduate(string nam,chars,inta, string t,floatsco,floatw)//構(gòu)造函數(shù)
:Person(nam,s,a),Teacher(nam,s,a,t),Student(nam,s,a,sco),wage(w){}
//初始化表
voidshow( ) //輸出研究生的有關(guān)數(shù)據(jù)
{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; //工資
};
//主函數(shù)
intmain( )
{Graduate grad1("Wang-li",'f',24,"assistant",89.5,1234.5);
grad1.show( );
return0;
}
