C++编程题继承与多态

定义商品类及其多层的派生类。以商品类为基类。第一层派生出服装类、家电类、车辆类。第二层派生出衬衣类、外衣类、帽子类、鞋子类;空调类、电视类、音响类;自行车类、轿车类、摩托车类。要求给出基本属性和派生过程中增加的属性。

解:按题意没有操作,所以只列出数据成员,也不再检验

#include <iostream>

using namespace std;

class Commodity{

        double price; //价格                  

        char name[20];//商品名

        char manufacturer[20];//生产厂家

        int items;//数量

};

class Clothing:public Commodity{//服装类

        char texture[20];//材料质地

};

class Electric_Appliance:public Commodity{//家电类

        enum {Black,White}type;//黑白家电

};

class Vehicle:public Commodity{//车辆类

        int wheel_num;//车轮数量

};

class Shirt:public Clothing{//衬衣类

        enum {Formal,Casual}Style;//式样:正式、休闲

};

class Garment:public Clothing{//外衣类

        enum {Jacket,Coat}Style;//式样:夹克、外套

};

class Hat:public Clothing{//帽子类;

        enum {Winter,Summer,Spring_Autumn}Style;//季节风格

};

class Shoes:public Clothing{//鞋子类

        enum {Winter,Summer,Spring_Autumn}Style;//季节风格

};

class Air_Cindition:public Electric_Appliance{//空调

        bool warm_cool;            //是否冷暖

        float power;//功率

};

class Television:public Electric_Appliance{//电视类

        int Size;                  //尺寸

        bool isColor;//是否彩色

};

class Acoustics:public Electric_Appliance{//音响类

        int speaker_num;         //喇叭数目

        float power;                     //功率

};

class Bicycle:public Vehicle{//自行车类

        int speed_grades;            //调速级数

        int wheel_size;                        //轮子大小

};

class Car:public Vehicle{//轿车类

        float volume;                   //排气量

        bool isSkylight;              //是否有天窗

        int box_num;                  //厢数

};

class Motorcycle:public Vehicle{//摩托车类

        float volume;                   //排气量

};

int main(){

    return 0;

}

以点(point)类为基类,重新定义矩形类和圆类。点为直角坐标点,矩形水平放置,由左下方的顶点和长宽定义。圆由圆心和半径定义。派生类操作判断任一坐标点是在图形内,还是在图形的边缘上,还是在图形外。缺省初始化图形退化为点。要求包括拷贝构造函数。编程测试类设计是否正确。

解:

#include <iostream>

#include <cmath>

using namespace std;

const double PI=3.1415926535;

class Point{

private:

        double x,y;

public:

        Point(){x = 0; y = 0; }

        Point(double xv,double yv){x = xv;y = yv;}

        Point(Point& pt){ x = pt.x; y = pt.y; }

        double getx(){return x;}

        double gety(){return y;}

        double Area(){return 0;}

        void Show(){cout<<"x="<<x<<' '<<"y="<<y<<endl;}

};

class Circle :public Point{

        double radius;

public:

        Circle(){radius = 0;}

        Circle(double xv,double yv,double vv):Point(xv,yv){radius = vv;}

        Circle(Circle& cc):Point(cc){radius = cc.radius;}  //拷贝构造函数       

        double Area(){return PI*radius*radius;}

        void Show(){//注意怎样访问基类的数据成员

        cout<<"x="<<getx()<<'\t'<<"y="<<gety()<<'\t'<<"radius="<<radius<<endl;

        }

        int position(Point &pt){

        double distance = sqrt((getx()-pt.getx())*(getx()-pt.getx())

                                    +(gety()-pt.gety())*(gety()-pt.gety()));

    double s=distance-radius;

        if(s==0) return 0;                      //在圆上

        else if(s<0) return -1;                                      //在圆内

        else return 1;                                                   //在圆外

        }

};

class Rectangle:public Point{

        double width,length;

public:

        Rectangle(){width=0; length=0; }

        Rectangle(double xv,double yv,double wv,double lv):Point(xv,xv)      {

                width = wv;

                length= lv;

        }

        Rectangle(Rectangle& rr):Point(rr){

                width = rr.width;

                length = rr.length;

        }

        double Area(){return width*length;}

        void Show(){

                cout<<"x="<<getx()<<'\t'<<"y="<<gety()<<'\t';         cout<<"width="<<width<<'\t'<<"length="<<length<<endl;

        }

        int position(Point &pt);

};

int Rectangle::position(Point &pt){

        double s1,s2;

        s1 = (pt.getx()-getx()); s2=(pt.gety()-gety());

if(((s1==0||s1==width)&&s2<=length)||((s2==0||s2==length)&&s1<=width)) return 0;

else if(s1<width&&s2<length) return -1;                       //0在矩形上,-1在矩形内

                else return 1;                                                                   //1在矩形外

}

int main(){

        Circle cc1(3,4,5),cc2,cc3(cc1);

        Rectangle rt1(0,0,6,8),rt2,rt3(rt1);

        Point p1(0,0),p2(6,8),p3(3,3),p4(8,4),p5(8,8);

        cc1.Show();

        cc2.Show();

        rt1.Show();

        rt2.Show();

        cout<<"点p1:";

        p1.Show();

        cout<<"矩形rt3:"<<'\t';

        rt3.Show();

        switch(rt3.position(p1)){

        case 0:cout<<"在矩形上"<<endl;break;

        case -1:cout<<"在矩形内"<<endl;break;

        case 1:cout<<"在矩形外"<<endl;break;

        }

        cout<<"圆cc3:"<<'\t';

        cc3.Show();

        switch(cc3.position(p1)){

        case 0:cout<<"在圆上"<<endl;break;

        case -1:cout<<"在圆内"<<endl;break;

        case 1:cout<<"在圆外"<<endl;break;

        }

        cout<<"点p2:";

        p2.Show();

        cout<<"矩形rt3:"<<'\t';

        rt3.Show();

        switch(rt3.position(p2)){

        case 0:cout<<"在矩形上"<<endl;break;

        case -1:cout<<"在矩形内"<<endl;break;

        case 1:cout<<"在矩形外"<<endl;break;

        }

        cout<<"圆cc3:"<<'\t';

        cc3.Show();

        switch(cc3.position(p2)){

        case 0:cout<<"在圆上"<<endl;break;

        case -1:cout<<"在圆内"<<endl;break;

        case 1:cout<<"在圆外"<<endl;break;

        }

        cout<<"点p3:";

        p3.Show();

        cout<<"矩形rt3:"<<'\t';

        rt3.Show();

        switch(rt3.position(p3)){

        case 0:cout<<"在矩形上"<<endl;break;

        case -1:cout<<"在矩形内"<<endl;break;

        case 1:cout<<"在矩形外"<<endl;break;

        }

        cout<<"圆cc3:"<<'\t';

        cc3.Show();

        switch(cc3.position(p3)){

        case 0:cout<<"在圆上"<<endl;break;

        case -1:cout<<"在圆内"<<endl;break;

        case 1:cout<<"在圆外"<<endl;break;

        }

        cout<<"点p4:";

        p4.Show();

        cout<<"矩形rt3:"<<'\t';

        rt3.Show();

        switch(rt3.position(p4)){

        case 0:cout<<"在矩形上"<<endl;break;

        case -1:cout<<"在矩形内"<<endl;break;

        case 1:cout<<"在矩形外"<<endl;break;

        }

        cout<<"圆cc3:"<<'\t';

        cc3.Show();

        switch(cc3.position(p4)){

        case 0:cout<<"在圆上"<<endl;break;

        case -1:cout<<"在圆内"<<endl;break;

        case 1:cout<<"在圆外"<<endl;break;

        }

        cout<<"点p5:";

        p5.Show();

        cout<<"矩形rt3:"<<'\t';

        rt3.Show();

        switch(rt3.position(p5)){

        case 0:cout<<"在矩形上"<<endl;break;

        case -1:cout<<"在矩形内"<<endl;break;

        case 1:cout<<"在矩形外"<<endl;break;

        }

        cout<<"圆cc3:"<<'\t';

        cc3.Show();

        switch(cc3.position(p5)){

        case 0:cout<<"在圆上"<<endl;break;

        case -1:cout<<"在圆内"<<endl;break;

        case 1:cout<<"在圆外"<<endl;break;

        }

        return 0;

}

几何形体的派生关系如下:

对平面形体有长和面积,对立体有表面积和体积,对几何图形基类,周长、面积和体积应怎样计算(用什么函数)?对平面图形体积怎样计算(用什么函数)?对立体图形周长怎么计算(用什么函数)?要求实现运行时的多态性。请编程,并测试。

解:运行时的多态性要用指针

#include <iostream>

#include <cmath>

using namespace std;

const double PI=3.1415926535;

class Geometric_shape{//几何图形

public:

        virtual double perimeter()=0;  //周长

        virtual double area()=0;          //面积

        virtual double volume()=0;             //体积

        virtual void Show(){};

};

class Circle :public Geometric_shape{//圆

        double radius;

public:

        Circle(){radius = 0; }

        Circle(double vv){radius = vv;}

        double perimeter(){return 2.0*PI*radius;}    //周长

        double area(){return PI*radius*radius;}        //面积

        double volume(){return 0;}            //体积

        void Show(){cout<<"radius="<<radius<<endl;}

};

class Rectangle:public Geometric_shape{//矩形

        double width,length;

public:

        Rectangle(){width=0; length=0;}//长宽

        Rectangle(double wid,double len){

                width = wid;

                length= len;

        }

        Rectangle(Rectangle& rr){

                width = rr.width;

                length = rr.length;

        }

        double perimeter(){return 2.0*(width+length);}    //周长

        double area(){return width*length;}              //面积

        double volume(){return 0;}            //体积

        void Show(){cout<<"width="<<width<<'\t'<<"length="<<length<<endl;}

};

class Triangle:public Geometric_shape{//三角形

        double a,b,c;

public:

        Triangle(){a=0;b=0;c=0;}

        Triangle(double v1,double v2,double v3){a = v1;b = v2;c = v3;}

        double perimeter(){return a+b+c;} //周长

        double area(){

                double s=(a+b+c)/2.0;

                return sqrt(s*(s-a)*(s-b)*(s-c));

        }              //面积

        double volume(){return 0;}            //体积

        void Show(){cout<<"a="<<a<<'\t'<<"b="<<b<<'\t'<<"c="<<c<<endl;}

};

class Box:public Rectangle{//长方体

        double height;

public:

        Box(){height=0;}

        Box(double wid,double len,double heg):Rectangle(wid,len){height=heg;}

        double volume(){return area()*height;}         //体积

};

class Cylinder:public Circle {//圆柱体

        double height;

public:

        Cylinder(){height=0;}

        Cylinder(double vv,double heg):Circle(vv){height=heg;}

        double volume(){return area()*height;}         //体积

};

class Cone: public Circle {//圆锥

        double height;

public:

        Cone(){height=0;}

        Cone(double vv,double heg):Circle(vv){height=heg;}

        double volume(){return area()*height/3;}              //体积

};

class T_pyramid:public Triangle{//三棱锥

        double height;

public:

        T_pyramid(){height=0;}

        T_pyramid(double v1,double v2,double v3,double heg):Triangle(v1,v2,v3){height=heg;}

        double volume(){return area()*height/3;}              //体积

};

class T_prism:public Triangle{//三棱柱

        double height;

public:

        T_prism(){height=0;}

        T_prism(double v1,double v2,double v3,double heg):Triangle(v1,v2,v3){height=heg;}

        double volume(){return area()*height;}         //体积

};

int main(){

        Geometric_shape * gs;

        Circle cc1(10);

        Rectangle rt1(6,8);

        Triangle tg1(3,4,5);

        Box bx1(6,8,3);

        Cylinder cl1(10,3);

        Cone cn1(10,3);

        T_pyramid tpy1(3,4,5,3);

        T_prism tpr1(3,4,5,3);

        cc1.Show();//静态

        cout<<"圆周长:"<<cc1.perimeter()<<'\t';

        cout<<"圆面积:"<<cc1.area()<<'\t';

        cout<<"圆体积:"<<cc1.volume()<<endl;

        gs=&rt1;//动态

        gs->Show();

        cout<<"矩形周长:"<<gs->perimeter()<<'\t';

        cout<<"矩形面积:"<<gs->area()<<'\t';

        cout<<"矩形体积:"<<gs->volume()<<endl;

        gs=&tg1;//动态

        gs->Show();

        cout<<"三角形周长:"<<gs->perimeter()<<'\t';

        cout<<"三角形面积:"<<gs->area()<<'\t';

        cout<<"三角形体积:"<<gs->volume()<<endl;

        gs=&bx1;//动态

        gs->Show();

        cout<<"长方体底周长:"<<gs->perimeter()<<'\t';

        cout<<"长方体底面积:"<<gs->area()<<'\t';

        cout<<"长方体体积:"<<gs->volume()<<endl;

        gs=&cl1;//动态

        gs->Show();

        cout<<"圆柱体底周长:"<<gs->perimeter()<<'\t';

        cout<<"圆柱体底面积:"<<gs->area()<<'\t';

        cout<<"圆柱体体积:"<<gs->volume()<<endl;

        gs=&cn1;//动态

        gs->Show();

        cout<<"圆锥体底周长:"<<gs->perimeter()<<'\t';

        cout<<"圆锥体底面积:"<<gs->area()<<'\t';

        cout<<"圆锥体体积:"<<gs->volume()<<endl;

        gs=&tpy1;//动态

        gs->Show();

        cout<<"三棱锥底周长:"<<gs->perimeter()<<'\t';

        cout<<"三棱锥底面积:"<<gs->area()<<'\t';

        cout<<"三棱锥体积:"<<gs->volume()<<endl;

        gs=&tpr1;//动态

        gs->Show();

        cout<<"三棱柱底周长:"<<gs->perimeter()<<'\t';

        cout<<"三棱柱底面积:"<<gs->area()<<'\t';

        cout<<"三棱柱体积:"<<gs->volume()<<endl;

        return 0;

}

某公司雇员(employee)包括经理(manager),技术人员(technician)和销售员(salesman)。开发部经理(developermanger),既是经理也是技术人员。销售部经理(salesmanager),既是经理也是销售员。

以employ类为虚基类派生出manager,technician和salesman类;再进一步派生出developermanager和salesmanager类。

employee类的属性包括姓名、职工号、工资级别,月薪(实发基本工资加业绩工资)。操作包括月薪计算函数(pay()),该函数要求输入请假天数,扣去应扣工资后,得出实发基本工资。

technician类派生的属性有每小时附加酬金和当月工作时数,及研究完成进度系数。业绩工资为三者之积。也包括同名的pay()函数,工资总额为基本工资加业绩工资。

salesman类派生的属性有当月销售额和酬金提取百分比,业绩工资为两者之积。也包括同名的pay()函数,工资总额为基本工资加业绩工资。

manager类派生属性有固定奖金额和业绩系数,业绩工资为两者之积。工资总额也为基本工资加业绩工资。

而developermanager类,pay()函数是将作为经理和作为技术人员业绩工资之和的一半作为业绩工资。

salesamanager类,pay()函数则是经理的固定奖金额的一半,加上部门总销售额与提成比例之积,这是业绩工资。

编程实现工资管理。特别注意pay()的定义和调用方法:先用同名覆盖,再用运行时多态。

解:

#include<iostream>

#include <string>

using namespace std;

static int Grades[]={500,600,750,1000,1400,2000,2800,4000};

class employee{

protected:

        string name;//姓名

        int ID;//职工号

        int grade;//工资级别

        double salary;//月

        double base_salary;//基本月薪

        double career_salary;//业绩工资

public:

        employee(string="",int=0,int=0);

        virtual void pay();//月薪计算函数

        void show();

        double getsalary(){return salary;}

        double getbase_salary(){return base_salary;}

        double getcareer_salary(){return career_salary;}

};

employee::employee(string nn,int id,int gr){

        name=nn;

        ID = id;

        grade = gr;

        salary=0;//月薪

        base_salary=0;//基本月薪

        career_salary=0;//业绩工资

}

void employee::show(){

        cout<<name<<'\t'<<ID<<'\t'<<salary<<endl;

}

void employee::pay(){

        int days;

        cout<<"请输入请假天数:\n";

        cin>>days;

        base_salary = Grades[grade]*(23 - days)/23;

        career_salary = base_salary/2;//普通员工业绩工资为基本工资的一半

        salary = base_salary+career_salary;

}

class manager:virtual public employee{//虚基类

protected:

        double prize;//固定奖金额

        double factor;//业绩系数

public:

        manager(string="",int=0,int=0,double=0);

        void pay();

};

manager::manager(string nn,int id,int gr,double pr):employee(nn,id,gr){

        prize = pr;//固定奖金额

        factor = 0;

}

void manager::pay(){

        int days;

        cout<<"请输入请假天数:\n";

        cin>>days;

        cout<<"请输入业绩系数:\n";

        cin>>factor;

        base_salary = Grades[grade]*(23 - days)/23;

        career_salary = prize*factor*(23 - days)/23;

        salary = base_salary + career_salary ;

}

class technician:virtual public employee{

protected:

        double hours;//月工作时数

        double perhour;//每小时附加酬金

        double shfactor;//研究进度系数

public:

        technician(string="",int=0,int=0,double=0);

        void pay();

};

technician::technician(string nn,int id,int gr,double phr):employee(nn,id,gr){

        hours = 0;

        perhour = phr;//每小时附加酬金

        shfactor = 0;

}

void technician::pay(){

        int days;

        cout<<"请输入请假天数:\n";

        cin>>days;

        cout<<"请输入研究进度系数:\n";

        cin>>shfactor;

        hours=8*(23-days);

        base_salary = Grades[grade]*(23 - days)/23;

        career_salary = perhour*hours*shfactor*(23 - days)/23;

        salary= base_salary + career_salary ;

}

class salesman:virtual public employee{

protected:

        double amount;//销售额

        double slfactor;//提成比例

public:

        salesman(string="",int=0,int=0,double=0);

        void pay();

};

salesman::salesman(string nn,int id,int gr,double slfac):employee(nn,id,gr)

{

        amount = 0;

        slfactor = slfac;//提成比例

}

void salesman::pay(){

        int days;

        cout<<"请输入请假天数:\n";

        cin>>days;

        cout<<"请输入销售额:\n";

        cin>>amount;

        base_salary = Grades[grade]*(23 - days)/23;

        career_salary = amount*slfactor;

        salary = base_salary + career_salary ;

}

class developermanager:public manager,public technician {

public:

        developermanager(string="",int id=0,int gr=0,double pr=0, double phr=0);

        void pay();

};

developermanager::developermanager(string nn,int id,int gr,double pr,double phr)

:manager(nn,id,gr,pr),technician(nn,id,gr,phr),employee(nn,id,gr){}

void developermanager::pay(){

        int days;

        cout<<"请输入请假天数:\n";

        cin>>days;

        cout<<"请输入业绩系数:\n";

        cin>>factor;

        cout<<"请输入研究进度系数:\n";

        cin>>shfactor;

        hours=8*(23-days);

        base_salary = Grades[grade]*(23 - days)/23;//基本工资

        career_salary = perhour*hours*shfactor*(23 - days)/23;//技术人员奖金

        career_salary += prize*factor*(23 - days)/23;//加经理业绩工资

        career_salary /=2;

        salary = base_salary + career_salary ;

}

class salesmanager:public manager,public salesman{

public:

        salesmanager(string=NULL,int=0,int=0,double pr=0, double slfac=0);

        void pay();

};

salesmanager::salesmanager(string nn,int id,int gr,double pr,double slfac)

:manager(nn,id,gr,pr),salesman(nn,id,gr,slfac),employee(nn,id,gr){}

void salesmanager::pay(){

        int days;

        cout<<"请输入请假天数:\n";

        cin>>days;

        cout<<"请输入业绩系数:\n";

        cin>>factor;

        cout<<"请输入销售额:\n";

        cin>>amount;

        base_salary = Grades[grade]*(23 - days)/23;//基本工资

        career_salary = prize*factor*(23 - days)/23;//经理业绩工资

        career_salary /=2;

        career_salary += amount*slfactor;//加销售业绩工资

        salary = base_salary + career_salary ;

}

int main(){

        employee eml1("张伟",10012,0),*emlp;

        manager mag1("姚婕",20005,4,1000);

        technician tec1("王茜",30047,5,10);

        salesman sal1("朱明",40038,2,0.05);

        developermanager dem1("沈俊",50069,6,1500,12);

        salesmanager sam1("况钟",60007,3,1000,0.05);

        eml1.pay();

        eml1.show();

        mag1.pay();

        mag1.show();

        tec1.pay();

        tec1.show();

        sal1.pay();

        sal1.show();

        emlp=&dem1;

        emlp->pay();

        emlp->show();

        emlp=&sam1;

        emlp->pay();

        emlp->show();

        return 0;

}

为上题添加拷贝构造函数,并测试是否正确。

解:

#include<iostream>

#include <string>

using namespace std;

static int Grades[]={500,600,750,1000,1400,2000,2800,4000};

class employee{

protected:

        string name;//姓名

        int ID;//职工号

        int grade;//工资级别

        double salary;//月

        double base_salary;//基本月薪

        double career_salary;//业绩工资

public:

        employee(string="",int=0,int=0);

        employee(employee &);           //拷贝构造函数

        virtual void pay();                //月薪计算函数

        void show();

        double getsalary(){return salary;}

        double getbase_salary(){return base_salary;}

        double getcareer_salary(){return career_salary;}

};

employee::employee(string nn,int id,int gr){

        name=nn;

        ID = id;

        grade = gr;

        salary=0;              //月薪

        base_salary=0;          //基本月薪

        career_salary=0;         //业绩工资

}

employee::employee(employee &emp){           //拷贝构造函数

        name=emp.name;

        ID=emp.ID;

        grade =emp.grade;

        salary=emp.salary;           //月薪

        base_salary=emp.base_salary;  //基本月薪

        career_salary=emp.career_salary;//业绩工资

}

void employee::show(){

        cout<<name<<'\t'<<ID<<'\t'<<salary<<endl;

}

void employee::pay(){

        int days;

        cout<<"请输入请假天数:\n";

        cin>>days;

        base_salary = Grades[grade]*(23 - days)/23;

        career_salary = base_salary/2;     //普通员工业绩工资为基本工资的一半

        salary = base_salary+career_salary;

}

class manager:virtual public employee{//虚基类

protected:

        double prize;//固定奖金额

        double factor;//业绩系数

public:

        manager(string="",int=0,int=0,double=0);

        manager(manager&mag);           //拷贝构造函数

        void pay();

};

manager::manager(manager&mag):employee(mag){//按赋值兼容规则mag可为employee的实参

        prize=mag.prize;

        factor=mag.factor;

}

manager::manager(string nn,int id,int gr,double pr):employee(nn,id,gr){

        prize = pr;//固定奖金额

        factor = 0;

}

void manager::pay(){

        int days;

        cout<<"请输入请假天数:\n";

        cin>>days;

        cout<<"请输入业绩系数:\n";

        cin>>factor;

        base_salary = Grades[grade]*(23 - days)/23;

        career_salary = prize*factor*(23 - days)/23;

        salary = base_salary + career_salary ;

}

class technician:virtual public employee{

protected:

        double hours;//月工作时数

        double perhour;//每小时附加酬金

        double shfactor;//研究进度系数

public:

        technician(string="",int=0,int=0,double=0);

        technician(technician &);           //拷贝构造函数

        void pay();

};

technician::technician(technician& tech):employee(tech){           //拷贝构造函数

        hours=tech.hours;//月工作时数

        perhour=tech.perhour;//每小时附加酬金

        shfactor=tech.shfactor;//研究进度系数

}

technician::technician(string nn,int id,int gr,double phr):employee(nn,id,gr){

        hours = 0;

        perhour = phr;//每小时附加酬金

        shfactor = 0;

}

void technician::pay(){

        int days;

        cout<<"请输入请假天数:\n";

        cin>>days;

        cout<<"请输入研究进度系数:\n";

        hours=8*(23 - days);

        cin>>shfactor;

        base_salary = Grades[grade]*(23 - days)/23;

        career_salary = perhour*hours*shfactor*(23 - days)/23;

        salary= base_salary + career_salary ;

}

class salesman:virtual public employee{

protected:

        double amount;//销售额

        double slfactor;//提成比例

public:

        salesman(string="",int=0,int=0,double=0);

        salesman(salesman &);           //拷贝构造函数

        void pay();

};

salesman::salesman(string nn,int id,int gr,double slfac):employee(nn,id,gr){

        amount = 0;

        slfactor = slfac;//提成比例

}

salesman::salesman(salesman &sale):employee(sale){           //拷贝构造函数

        amount=sale.amount;//销售额

        slfactor=sale.slfactor;//提成比例

}

void salesman::pay(){

        int days;

        cout<<"请输入请假天数:\n";

        cin>>days;

        cout<<"请输入销售额:\n";

        cin>>amount;

        base_salary = Grades[grade]*(23 - days)/23;

        career_salary = amount*slfactor;

        salary = base_salary + career_salary ;

}

class developermanager:public manager,public technician {

public:

        developermanager(string="",int id=0,int gr=0,double pr=0, double phr=0);

        developermanager(developermanager &);           //拷贝构造函数

        void pay();

};

developermanager::developermanager(string nn,int id,int gr,double pr,double phr)

:manager(nn,id,gr,pr),technician(nn,id,gr,phr),employee(nn,id,gr){}

developermanager::developermanager(developermanager &deman)

        :manager(deman),technician(deman),employee(deman){}           //拷贝构造函数

void developermanager::pay(){

        int days;

        cout<<"请输入请假天数:\n";

        cin>>days;

        cout<<"请输入业绩系数:\n";

        cin>>factor;

        cout<<"请输入研究进度系数:\n";

        cin>>shfactor;

        hours=8*(23 - days);

        base_salary = Grades[grade]*(23 - days)/23;//基本工资

        career_salary = perhour*hours*shfactor*(23 - days)/23;//技术人员奖金

        career_salary += prize*factor*(23 - days)/23;//加经理业绩工资

        career_salary /=2;

        salary = base_salary + career_salary ;

}

class salesmanager:public manager,public salesman{

public:

        salesmanager(string="",int=0,int=0,double pr=0, double slfac=0);

        salesmanager(salesmanager &);           //拷贝构造函数

        void pay();

};

salesmanager::salesmanager(string nn,int id,int gr,double pr,double slfac)

:manager(nn,id,gr,pr),salesman(nn,id,gr,slfac),employee(nn,id,gr){}

salesmanager::salesmanager(salesmanager& salman)

        :manager(salman),salesman(salman),employee(salman){}           //拷贝构造函数

void salesmanager::pay(){

        int days;

        cout<<"请输入请假天数:\n";

        cin>>days;

        cout<<"请输入业绩系数:\n";

        cin>>factor;

        cout<<"请输入销售额:\n";

        cin>>amount;

        base_salary = Grades[grade]*(23 - days)/23;//基本工资

        career_salary = prize*factor*(23 - days)/23;//经理业绩工资

        career_salary /=2;

        career_salary += amount*slfactor;//加销售业绩工资

        salary = base_salary + career_salary ;

}

int main(){

        employee eml1("张伟",10012,0),*emlp;

        manager mag1("姚婕",20005,4,1000);

        technician tec1("王茜",30047,5,10);

        salesman sal1("朱明",40038,2,0.05);

        developermanager dem1("沈俊",50069,6,1500,12);

        salesmanager sam1("况钟",60007,3,1000,0.05);

        eml1.pay();

        eml1.show();

        mag1.pay();

        mag1.show();

        tec1.pay();

        tec1.show();

        sal1.pay();

        sal1.show();

        emlp=&dem1;

        emlp->pay();

        emlp->show();

        emlp=&sam1;

        emlp->pay();

        emlp->show();

        cout<<endl;

        employee eml0(eml1);

        manager mag0(mag1);

        technician tec0(tec1);

        salesman sal0(sal1);

        developermanager dem0(dem1);

        salesmanager sam0(sam1);

        cout<<"输出拷贝结果:"<<endl;

        eml0.show();

        mag0.show();

        tec0.show();

        sal0.show();

        emlp=&dem0;

        emlp->show();

        emlp=&sam0;

        emlp->show();

        return 0;

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值