公有繼承和私有繼承的例項
#include "iostream.h"
#include "string.h"class person//基類person定義
{
private:
char name[20];
int age;
bool sex;//0代表女,1代表男
public:
person()//基類建構函式
{strcpy(name,"");
sex = 1;
age = 0;
}
person(char *strName,bool bSex,int nAge)//基類建構函式
{
setName(strName);
setSex(bSex);
setAge(nAge);
}
void setName(char *strName)//設定姓名
{
strcpy(name,strName);
}
void setSex(bool bSex)//設定性別
{
sex = bSex;
}
void setAge(int nAge)//設定年齡
{
age = nAge;
}
void display()//顯示人員資訊
{
cout<<"姓名為:"<<name<<endl;
cout<<"性別為:"<<(sex==1?"男":"女")<<endl;
cout<<"年齡為:"<<age<<endl;
}
};
class student : public person//派生類student定義,公有繼承自基類person
{
private:
char SID[20];
public:
student() //派生類student建構函式
{
strcpy(SID,"");
}
student(char *strName,bool bSex,int nAge,char *strID)//派生類student建構函式
{
setName(strName);
setSex(bSex);
setAge(nAge);
setSID(strID);
}
void setSID(char *strID)//設定學號
{
strcpy(SID,strID);
}
void display()//顯示學生資訊
{
person::display();//顯示繼承自基類的基本資訊
cout<<"學號:"<<SID<<endl;//顯示student類獨有的學號資訊
}
};
void main()
{
student s1("林燕",0,25,"0430900001"),s2; //分別呼叫兩個建構函式,構造兩個物件s1,s2。
cout<<"呼叫s1.person::display()的輸出為:"<<endl;
s1.person::display();//s1呼叫基類的display,輸出結果
cout<<"呼叫s1.display()的輸出為:"<<endl;
s1.display();//s1呼叫派生類的display,輸出結果
cout<<"呼叫s2.display()的輸出為:"<<endl;
s2.display();//s2呼叫派生類的display方法,輸出結果為初始值
s2.setName("王小明");//對s2的姓名、性別、年齡、學號等進行設定
s2.setAge(23);
s2.setSex(1);
s2.setSID("0430900002");
cout<<"呼叫s2.display()的輸出為:"<<endl;
s2.display();//再次輸出s2的資訊,為新設定的資訊
}
/////以上如果換成是私有繼承,則訪問許可權發生如下變化:
void main()
{
student s1("林燕",0,25,"0430900001"),s2; //分別呼叫兩個建構函式,構造兩個物件s1,s2。
// cout<<"呼叫s1.person::display()的輸出為:"<<endl;
// s1.person::display();//s1呼叫基類的display,輸出結果
cout<<"呼叫s1.display()的輸出為:"<<endl;
s1.display();//s1呼叫派生類的display,輸出結果
cout<<"呼叫s2.display()的輸出為:"<<endl;
s2.display();//s2呼叫派生類的display方法,輸出結果為初始值
// s2.setName("王小明");//對s2的姓名、性別、年齡、學號等進行設定
// s2.setAge(23);
// s2.setSex(1);
s2.setSID("0430900002");
cout<<"呼叫s2.display()的輸出為:"<<endl;
s2.display();//再次輸出s2的資訊,為新設定的資訊
}
//一個類中有三種類型的成員:private、protected和public 型別的成員,他們的區別是:
/*私有的只能在本類體中被用(不管是資料間的運算還是被成員函式使用);
保護的只能在本類體中或者在子類體中被用;
公有的可以在本類體中或者在子類體中,或者在類體外。
*/
//一個類的私有成員(通常是資料成員)是不能在該類的類外去訪問的,只能在本類中的成員函式去訪問,所以資料成員一般由類體裡的成員函式去做形式上的賦值,然後具體生成物件時呼叫物件的函式來完成具體賦值,這時候就沒有出現類的資料成員在類外被使用的情況,因為傳遞的是實參;
//這是因為公有繼承時,基類的公有成員函式在派生類的訪問許可權不變,即還是子類的public成員,所以可以在子類的類外去訪問它們;
//這是因為私有繼承時,基類的公有成員函式在派生類的訪問許可權改變了,即父類的成員函式是子類的私有成員,不能子類的類外去訪問它們。