日B视频 亚洲,啪啪啪网站一区二区,91色情精品久久,日日噜狠狠色综合久,超碰人妻少妇97在线,999青青视频,亚洲一区二卡,让本一区二区视频,日韩网站推荐

您好,歡迎來電子發(fā)燒友網(wǎng)! ,新用戶?[免費(fèi)注冊(cè)]

當(dāng)前位置:電子發(fā)燒友網(wǎng) > 圖書頻道 > 電子 > 《C++程序設(shè)計(jì)實(shí)踐例題》 > 第4章 第四章

第2節(jié) 第二部分

例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;

}

?
通海县| 安岳县| 靖江市| 平湖市| 南皮县| 辉县市| 永城市| 康定县| 金阳县| 和硕县| 达州市| 东港市| 黄龙县| 扶绥县| 菏泽市| 屯留县| 开平市| 南康市| 阿荣旗| 错那县| 张家界市| 安徽省| 屏东市| 红安县| 汾西县| 自贡市| 浑源县| 梨树县| 咸丰县| 江孜县| 正宁县| 靖江市| 敦化市| 喀喇沁旗| 扎赉特旗| 通城县| 乌海市| 扎鲁特旗| 绥棱县| 城固县| 慈溪市|