问题 填空题

[说明]
下面程序是一个小型公司工资管理的程序。该公司主要有4类人员:经理、兼职技术人员、销售员和销售经理。基类为employee,由它派生出technician类,manager类,salesman类,最后由manager类和salesman类派生出salesmanager类。月工资计算办法是:经理拿固定月薪8000;兼职技术人员按每小时100元领取月薪; 销售按当月销售额的4%提成; 销售经理既拿固定月工资也领取销售提成,固定月工资5000元,销售提成为所管辖部门当月销售总额的0.5%。
[C++程序]
#include<iostream.h>
#include<string.h>
class employee

protected:
int no;
char name [10] ;
float salary;
public :
employee ()

cout<< "职工编号: " ;
cin>>no ;
cout<<"职工姓名:";
cin>>name ;
salary= 0 ;

void pay ()
void display ()
;
class technician:public employee
private :
float hourlyrate;
int workhours;
public :
technician() hourlyrate=100;
void pay ()

cout<<name本月工作时数: " ;
cin>>workhours ;
salary=hourlyrate*workhours;

void display ()

cout<<"兼职技术人员"<<name<<"(编号为"<<no\
<<")"<<"本月工资:"<<salary<<endl;

;
class salesman: (1)

protected:
float commrate;
float sales;
public:
salesman() commrate=0.04;
void pay()

cout<<name<<"本月销售额:";
cin>>sales;
salary= (2) ;

void display()

cout<<"销售额"name<<"(编号"<<no<<\
<<")"<<"本月工资:"<<salary<<endl;

;
class manager: (3)

protected:
float monthlypay;
public:
manager()monthlypay=8000;
void pay()salary=monthlypay;
void display()

cout<<"经理"<<name<<"(编号为"<<no\
<<")"<<"本月工资:"<<salary<<endl;

;
class salesmanager: (4)

public:
salesmanager()

monthlypay=5000;
commrate=0.005;

void pay()

cout<<name<<"所管部门月销售量:";
cin>>sales:
salary= (5) ;

void display()

cout<<"销售经理"<<name<<"(编号为"<<no\
<<")"<<"本月工资:"<<salary<<endl;

;

答案

参考答案:monthlypay+commrate*sales

解析: 本题以C++语言为载体,考查面向对象的对象设计中的重要概念——虚基类。
根据题意,salesmanager是manager和salesman派生来的,当某类的部分或全部直接基类是从另一个共同基类派生而来时,这些直接基类中从上一级基类继承来的成员就拥有相同的名称。在派生类的对象中,同名成员在内存中同时拥有多个副本,可以使用作用域分辨符来唯一标识并分别访问它们,也可以将直接基类的共同基类设置为虚基类。所以空(1)和空(3)应该分别填入virtual public employee和virtual public employee,空(4)应该填入public manager,public salesman,根据题目中的条件,可以填写出销售员和销售经理的月薪公式,空(2)和空(5)应该分别填入sales*commrate和monthlypay+commrate*sales。

单项选择题
单项选择题