C++程序设计教程 第11讲:虚函数(I
C++程序设计教程 第11讲: 虚函数(I)
关于多态性 多态性( polymorphism) Shape TwoDimShape ThreeDim Shape Circle Sphere Square Cube Triangle Tetrahedron
关于多态性 多态性(polymorphism) Shape TwoDimShape ThreeDimShape Circle Square Triangle Sphere Cube Tetrahedron
例7-10:人员信息管理 class employee i protected: char name[20]; 姓名 int individua1mpN。; /个人编号 int grade //级别 float accuray i /月薪 static int employeeno i /本公司职员目前的最大值 public: employee()i /构造函数 virtual employee() /析构函数 void Payo)[] /计算月薪函数函数为空 void Get工 individua1 EmpNo();//获取个人编号 float GetAccumPay()i /获取月薪
例 7-10:人员信息管理 class employee { protected: char name[20]; // 姓名 int individualEmpNo; // 个人编号 int grade; // 级别 float accumPay; // 月薪 static int employeeNo; // 本公司职员目前的最大值 public: employee(); // 构造函数 virtual ~employee(); // 析构函数 void Pay() {} // 计算月薪函数 函数为空 void GetIndividualEmpNo(); // 获取个人编号 float GetAccumPay(); // 获取月薪 … … };
例7-10:人员信息管理 int employee: employeeNo 1000 员工编号基数为1000 employee:: employee individualEmpNo employeeNo++i //新员工编号为目前最大号加1 grade 1 accumPay =0.ofi int employee:: GetIndividualEmpNo()//获取个人编号 t return individualEmpNo; j float emp1oyee:: GetAccumPay()//获取月薪 t return accumPayi I
例 7-10:人员信息管理 int employee::employeeNo = 1000; // 员工编号基数为 1000 employee::employee() { individualEmpNo = employeeNo++; // 新员工编号为目前最大号加1 grade = 1; accumPay = 0.0f; } int employee::GetIndividualEmpNo() // 获取个人编号 { return individualEmpNo; } float employee:: GetAccumPay() // 获取月薪 { return accumPay; }
例7-10:人员信息管理 class technician public employee /技术人员类 t private: float hourlyRate int workhours public: technician; void SetWorkHours (int wh) void Pay ()i technician:: technician( i hourlyRate 100; workHours 200; F void technician:: Pay ( /计算月薪,按小时计算 accumPay hourly Rate workHours;
例 7-10:人员信息管理 class technician : public employee // 技术人员类 { private: float hourlyRate; int workHours; public: technician(); void SetWorkHours(int wh); void Pay(); }; technician::technician() { hourlyRate = 100; workHours = 200; } void technician::Pay() { // 计算月薪,按小时计算 accumPay = hourlyRate * workHours; }
例7-10:人员信息管理 1 ass salesman: public employee//推销员类 private float CommRate float sales i public: salesman oi void SetSales(float) void Pay(() void salesman:: salesman ( CommRate=0.04; sales=100000;}//设置销售额 void salesman:: Pay() accumPay sales CommRate i //计算月薪,按提成比例计算
例 7-10:人员信息管理 class salesman : public employee // 推销员类 { private: float CommRate; float sales; public: salesman(); void SetSales(float); void Pay(); }; void salesman::salesman() { CommRate = 0.04; sales = 100000; } // 设置销售额 void salesman::Pay() { accumPay = sales * CommRate; // 计算月薪,按提成比例计算 }
例7-10:人员信息管理 c1 ass manager: public emp1oyee//推销员类 private: float Monthly i public: manager ()i void Setsales(float) void Pay o)i manager:: manager o) MonthlyPay =8000; void manager:: Pay () t accumPay Monthly Pay i /计算月薪,按提成比例计算
例 7-10:人员信息管理 class manager : public employee // 推销员类 { private: float MonthlyPay; public: manager (); void SetSales(float); void Pay(); }; manager::manager() { MonthlyPay = 8000; } void manager::Pay() { accumPay = MonthlyPay ; // 计算月薪,按提成比例计算 }
int main()「预想的结果|编号1000本月工资8000 manager 编号1001本月工资20000 technician tl; salesman s1 编号1002本月工资4000 employee *emp [3]=i&ml,&tl, &s1] fQr(int1实际输出)编号1000月工资0 编号1001本月工资0 emp [i]->pay ()i eoutGetIndividualEmpNo () GetAccumPay ()<< endli
int main() { manager m1; technician t1; salesman s1; employee *emp[3] = {&m1, &t1, &s1}; for(int i=0;ipay(); cout GetIndividualEmpNo() GetAccumPay() << endl; } } 编号 1000 本月工资 8000 编号 1001 本月工资 20000 编号 1002 本月工资 4000 预想的结果 编号 1000 本月工资 0 编号 1001 本月工资 0 编号 1002 本月工资 0 实际输出
int main() I manager m1 technician t1;基类的指针 派生类的地址 salesman s1 employee *emp [3]=i&ml,&tl, &s1] for(int i=0; 1Pay ()i eoutGetIndividualEmpNo () GetAccumPay()<< endl
int main() { manager m1; technician t1; salesman s1; employee *emp[3] = {&m1, &t1, &s1}; for(int i=0;iPay(); cout GetIndividualEmpNo() GetAccumPay() << endl; } } 基类的指针 派生类的地址 基类的函数
§8.3虚函数 虚函数的目的是告诉编译器,对于指向基类的指针 而言,如果它派生类中有同名的函数(被重载) 优先执行派生类中的该函数 基类指针 Employee 基 Employee 类 Pay0 指针 virtual Pay0: Manager Manager Payo virtual Pay(: 基类指针只能访问基类的函数基类指针可以访问派生类的函数
§8.3 虚函数 虚函数的目的是告诉编译器,对于指向基类的指针 而言,如果它派生类中有同名的函数(被重载), 则优先执行派生类中的该函数。 Employee Pay(); Manager Pay(); 基 类 指 针 Employee virtual Pay(); Manager virtual Pay(); 基 类 指 针 基类指针只能访问基类的函数 基类指针可以访问派生类的函数