您好,欢迎来电子发烧友网! ,新用户?[免费注册]

当前位置:电子发烧友网 > 图书频道 > 电子 > 《C++程序设计实践例题》 > 第4章 第四章

第2节 第二部分

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

}