1、例题继承与多态例1:继承中的构造函数#include class B1 /基类B1,构造函数有参数public: B1(int i) coutconstructing B1 iendl;class B2 /基类B2,构造函数有参数public: B2(int j) coutconstructing B2 jendl;class B3 /基类B3,构造函数无参数public: B3()coutconstructing B3 *endl;class C: public B2, public B1, public B3 /派生新类C/注意基类名的顺序public: /派生类的公有成员 C(int a
2、, int b, int c, int d):B1(a),memberB2(d),memberB1(c),B2(b) /注意基类名的个数与顺序 /注意成员对象名的个数与顺序private: /派生类的私有对象成员 B1 memberB1; B2 memberB2; B3 memberB3;void main() C obj(1,2,3,4);输出结果:constructing B2 2constructing B1 1constructing B3 *constructing B1 3constructing B2 4constructing B3 *Press any key to cont
3、inue例:21虚基类#include using namespace std;class B0 /声明基类B0 int nV; public: /外部接口 B0(int n) nV=n; void fun()coutMember of B0:nV=nVendl;class B1: public B0 / virtual int nV1; public: B1(int a,int b) : B0(a) nV1=b; void fun() B0:fun();coutMember of B1:nV1=nV1endl; ;class B2: public B0 /virtual int nV2; p
4、ublic: B2(int a,int b) : B0(a) nV2=b; void fun() B0:fun();coutMember of B2:nV2=nV2endl; ;class D1: public B1, public B2int nVd;public: D1(int a,int b,int c,int d) : B1(a,b), B2(b,c)nVd=d;/B0(a), void fund()coutMember of D1:nVd=nVdendl;int main() D1 d1(1,2,3,4); d1.fund(); d1.B1:fun(); d1.B2:fun(); /
5、d1.B0:fun(); return 0;无虚基类Member of D1:nVd=4Member of B0:nV=1Member of B1:nV1=2Member of B0:nV=2Member of B2:nV2=3Press any key to continue有虚基类:Member of D1:nVd=4Member of B0:nV=1Member of B1:nV1=2Member of B0:nV=1Member of B2:nV2=3Member of B0:nV=1Press any key to continue例22:虚基类#include #include c
6、lass personpublic: person(int n, char* strname, char s, char* strfrom) coutendlperson constructorendl; id = n; strcpy(name, strname); sex = s; strcpy(from, strfrom); void showinfo() coutendlID: id endlname: name endlsex: sex endlfrom: from; protected: int id; char name10; char sex; char from20;class
7、 undergraduate :virtual public person / 虚继承public: undergraduate(int n, char* strname, char s, char* strfrom, float sc) :person(n, strname, s, strfrom) coutendlundergraduate constructorendl; score = sc; void showinfo() person:showinfo(); coutendlscore: score; protected: float score;class teacher :vi
8、rtual public person / 虚继承public: teacher(int n, char* strname, char s, char* strfrom, float sa) :person(n, strname, s, strfrom) salary = sa; coutendlteacher constructorendl; void showinfo() person:showinfo(); coutendlsalary: salary; protected: float salary;class graduate :public undergraduate, publi
9、c teacher / 从两个类继承public: graduate(int n, char* strname, char s, char* strfrom, float sc, float sa) :person(n, strname, s, strfrom),undergraduate(2,jetty,M,china,90), teacher(3, rose, F, American, 2000) /*id = n; strcpy(name, strname); sex = s; strcpy(from, strfrom); score = sc; salary = sa;*/ void
10、showinfo() coutendlID: id endlname: name endlsex: sex endlfrom: from endlscore: score endlsalary: salary; ;void main() graduate g(1, jetty, M, china,95,3000); g.showinfo();输出结果:person constructorundergraduate constructorteacher constructorID: 1name: jettysex: Mfrom: chinascore: 90salary: 2000Press a
11、ny key to continue例3:多态性31:#include class Base /基类声明 int i;public: /外部接口 Base(int i1) i=i1; /virtual void print()couti=iendl; /虚成员函数;class D: public Base /公有派生 char ch;public: D(char c1,int c2) : Base(c2) ch=c1;/virtual void print()Base:print(); couti=iprint(); /i=100 i=100 ch=A3-2:#include class B0
12、 /基类B0声明public: /外部接口 /virtual void display()coutB0:display()endl; /虚成员函数;class B1: public B0 /公有派生public: void display()coutB1:display()endl; /虚成员函数;class D1: public B1 /公有派生public: void display()coutD1:display()display();void main() /主函数 B0 b0,*p; /定义基类对象和指针 B1 b1; /定义派生类对象 D1 d1; /定义派生类对象 p=&b0;
13、fun(p); /调用基类B0函数成员 p=&b1; fun(p); /调用派生类B1函数成员 p=&d1; fun(p); /调用派生类D1函数成员输出结果:B0:display()B0:display()B0:display()Press any key to continue加上虚函数结果:B0:display()B1:display()D1:display()例4:实例公司人员管理/employee.hclass employeeprotected: char *name; /姓名 int individualEmpNo; /个人编号 int grade; /级别 float accu
14、mPay; /月薪总额 static int employeeNo; /本公司职员编号目前最大值public: employee(); /构造函数 employee(); /析构函数 virtual void pay()=0; /计算月薪函数(纯虚函数) virtual void promote(int increment=0); /升级函数(虚函数) virtual void displayStatus()=0; /显示人员信息(纯虚函数);class technician :public employee /兼职技术人员类private: float hourlyRate; /每小时酬金
15、int workHours; /当月工作时数public: technician(); /构造函数 void promote(int); /升级函数 void pay(); /计算月薪函数 void displayStatus(); /显示人员信息;class salesman :virtual public employee /兼职推销员类protected: float CommRate; /按销售额提取酬金的百分比 float sales; /当月销售额public: salesman(); /构造函数 void promote(int); /升级函数 void pay(); /计算月薪
16、函数 void displayStatus(); /显示人员信息;class manager :virtual public employee /经理类protected: float monthlyPay; /固定月薪数public: manager(); /构造函数 void promote(int); /升级函数 void pay(); /计算月薪函数 void displayStatus(); /显示人员信息;class salesmanager :public manager, public salesman /销售经理类public: salesmanager(); /构造函数 v
17、oid promote(int); /升级函数 void pay(); /计算月薪函数 void displayStatus(); /显示人员信息;/empfunc.cpp#include#include#includeemployee.hint employee:employeeNo=1000; /员工编号基数为1000employee:employee() char namestr50; /输入雇员姓名时首先临时存放在namestr中 coutnamestr; name=new charstrlen(namestr)+1; /动态申请用于存放姓名的内存空间 strcpy(name,name
18、str); /将临时存放的姓名复制到name individualEmpNo=employeeNo+; /新输入的员工,其编号为目前最大编号加1 grade=1; /级别初值为1 accumPay=0.0; /月薪总额初值为0employee:employee() delete name; /在析构函数中删除为存放姓名动态分配的内存空间void employee:promote(int increment) grade+=increment; /升级,提升的级数由increment指定technician:technician() hourlyRate=100; /每小时酬金100元void
19、technician:promote(int) employee:promote(2); /调用基类的升级函数,升2级void technician:pay() cout请输入nameworkHours; accumPay=hourlyRate*workHours; /计算月薪,按小时计酬 cout兼职技术人员name编号individualEmpNo 本月工资accumPayendl;void technician:displayStatus() cout兼职技术人员name编号individualEmpNo 级别为grade级,已付本月工资accumPayendl;salesman:sal
20、esman() CommRate=0.04; /销售提成比例4%void salesman:promote(int) employee:promote(0); /调用基类的升级函数,升0级void salesman:pay() cout请输入namesales; accumPay=sales*CommRate; /月薪=销售提成 cout推销员name编号individualEmpNo 本月工资accumPayendl;void salesman:displayStatus() cout推销员name编号individualEmpNo 级别为grade级,已付本月工资accumPayendl;
21、manager:manager() monthlyPay=8000; /固定月薪8000元void manager:promote(int) employee:promote(3); /调用基类的升级函数,升3级void manager:pay() accumPay=monthlyPay; /月薪总额即固定月薪数 cout经理name编号individualEmpNo 本月工资accumPayendl;void manager:displayStatus() cout经理name编号individualEmpNo 级别为grade级,已付本月工资accumPayendl;salesmanage
22、r:salesmanager() monthlyPay=5000; CommRate=0.005;void salesmanager:promote(int) employee:promote(2); /调用基类的升级函数,升2级void salesmanager:pay() cout请输入employee:namesales; accumPay=monthlyPay+CommRate*sales; /月薪=固定月薪+销售提成 cout销售经理name编号individualEmpNo 本月工资accumPayendl;void salesmanager:displayStatus() cout销售经理name编号individualEmpNo 级别为grade级,已付本月工资accumPayendl;/8_7.cpp#include#includeemployee.hint main() manager m1; technician t1; salesmanager sm1; salesman s1; employee *emp4=&m1,&t1,&sm1,&s1; /用指针数组的个元素存放各对象的地址 int i; for(i=0;ipromote(); empi-pay(); empi-displayStatus(); return 0;
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1