1. 程式人生 > >公有繼承和私有繼承的例項

公有繼承和私有繼承的例項

#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成員,所以可以在子類的類外去訪問它們;

//這是因為私有繼承時,基類的公有成員函式在派生類的訪問許可權改變了,即父類的成員函式是子類的私有成員,不能子類的類外去訪問它們。