Abstraction Encapsulation Inheritance Polymorphism class walkman virtual void
面向对象程序设计的特征 抽象性(Abstraction) 封装性(Encapsulation) 继承性(Inheritance) 多态性(Polymorphism)
面向对象程序设计的精华 • 通过一个简单的接口对不同的实现进行概念上的 简化。 class walkman{ 提供给用户 virtual void on( )=0; 相同的接口 virtual void off( )=0; virtual void play( )=0; virtual void record( )=0; virtual void stop( )=0; }; Cassette player, CD player, MP 3 player;
#include <iostream. h> class shape{ 为什么需要虚函数 public: float area( ){ return -1; } }; class circle: public shape{ float radius; public: void circle(float r){ radius = r; } float area( ){ return 3. 14159*radius; } };
void main() { The pointer of base class “shape". 为什么需要虚函数 shape obj, *ptr; circle c(3. 6); ptr=&obj; cout<<ptr->area( )<<endl; 求圆形的面积 ptr=&c; cout<<ptr->area( )<<endl; }
#include <iostream. h> class shape{ 虚函数 被关键字virtual说明 的函数称为虚函数 public: virtual float area( ){ return -1; } }; class circle: public shape{ float radius; public: void circle(float r){ radius = r; } float area( ){ return 3. 14159*radius; } };
The pointer of base class “shape". void main() { shape obj, *ptr; circle c(3. 6); ptr=&obj; cout<<ptr->area( )<<endl; C++的编译器对 虚函数调用采取 动态联编方式 ptr=&c; cout<<ptr->area( )<<endl; } 输出结果: -1 40. 715 使用虚函数后的输出结果
虚函数的使用分析 class shape{ public: virtual float area( ) { }; }; class triangle: public shape{ 在派生类中,虚函数被 重新定义以实现不同的 操作。 这种方式称为 函数超越(overriding), 又称为函数覆盖。 float H, W; public: triangle(float h, float w){H=h; W=w; } float area( ) {return H*W*0. 5; } };
class rectangle: public shape{ float H, W; public: rectangle(float h, float w){ H=h; W=w; } float area( ){return H*W; } };
void main( ) { shape *s; triangle tri(3, 4); 请注意:在这里以指 针s所指的对象来确定 执行虚函数area()的 哪个版本。 rectangle rect(3, 4); s=&tri; cout<<“The area of triangle: ”<<s->area()<<endl; s=▭ cout<< “The area of rectangle: ” <<s->area()<<endl; } “确定”是在运行时 执行的,这构成了 运行时的多态性
class shape{ public: 纯虚函数的例子 virtual float area( )=0; //A PURE VIRTUAL FUNCTION }; class triangle: public shape{ float H, W; public: triangle(float h, float w){H=h; W=w; } float area( ){return H*W*0. 5; } }; 纯虚函数
抽象类的例子 void main( ) { shape *s; triangle tri(3, 4); rectangle rect(3, 4); Shape是抽象类, 只能定义指向该 类对象的指针 s=&tri; cout<<“The area of triangle: ”<<s->area()<<endl; s=▭ cout<< “The area of rectangle: ” <<s->area()<<endl; }
class employee { protected: char *name; int individual. Emp. No; int grade; float accum. Pay; static int employee. No; //姓名 //个人编号 //级别 //月薪总额 //本公司职员 编号目前最大值 public: employee(); //构造函数 ~employee(); //析构函数 virtual void pay( )= 0; //计算月薪函数 virtual void promote(int); //升级函数 virtual void display. Status( )= 0; //显示人员信息 };
class technician : public employee //技术人员类 { private: float hourly. Rate; //每小时酬金 int work. Hours; //当月 作时数 public: technician(); //构造函数 void promote(int); void pay(); //计算月薪函数 void display. Status(); //显示人员信息 };
class salesman: virtual public employee //兼职推销员类 { protected: float Comm. Rate; //按销售额提取酬金的百分比 float sales; //当月销售额 public: salesman(); //构造函数 void promote(int); void pay(); //计算月薪函数 void display. Status(); //显示人员信息 };
class manager: virtual public employee //经理类 { protected: float monthly. Pay; //固定月薪数 public: manager(); //构造函数 void promote(int); void pay(); //计算月薪函数 void display. Status(); //显示人员信息 };
class salesmanager : public manager, public salesman // 销售经理类 { public: salesmanager (); //构造函数 void promote(int); void pay(); //计算月薪函数 void display. Status(); //显示人员信息 };
employee : : ~employee( ) { delete name ; //在析构函数中删除为存放姓名动态分配的内存空间 } /* void employee : : pay() //计算月薪,空函数 { } */ void employee : : promote(int increment) { grade += increment ; //升级,提升的级数由 increment指定 } /* void employee : : display. Status( ) //显示人员信息,空函数 { } */
technician : : technician() { hourly. Rate=100; //每小时酬金 100元 } void technician: : pay() { cout<<"请输入"<<name<<"本月的 作时数: "; cin>>work. Hours; accum. Pay=hourly. Rate* work. Hours; //计算月薪,按小时计酬 cout<<"兼职技术人员"<<name<<"编号"<<individual. Emp. No <<"本月 资"<<accum. Pay<<endl; } void technician: : display. Status() { cout<<“兼职技术人员”<<name<<“编号” << individual. Emp. No << "级别为" <<grade<< "级,已付本月 资"<<accum. Pay<<endl; }
salesman: : salesman() { Comm. Rate=0. 04; //销售提成比例4% } void salesman: : pay() { cout<<"请输入"<<name<<"本月的销售额: "; cin>>sales; accum. Pay=sales*Comm. Rate; //月薪=销售提成 cout<<"推销员"<<name<<"编号"<<individual. Emp. No <<"本月 资"<<accum. Pay<<endl; } void salesman: : display. Status() { cout<<"推销员"<<name<<"编号"<<individual. Emp. No <<"级别为"<<grade<<"级,已付本月 资 "<<accum. Pay<<endl; }
manager: : manager() { monthly. Pay=8000; //固定月薪 8000元 } void manager : : pay() { accum. Pay=monthly. Pay; //月薪总额即固定月薪数 cout<<"经理"<<name<<"编号"<<individual. Emp. No <<"本月 资"<<accum. Pay<<endl; } void manager : : display. Status() { cout<<"经理"<<name<<"编号"<<individual. Emp. No <<"级别为"<<grade<<"级,已付本月 资 "<<accum. Pay<<endl; }
salesmanager : : salesmanager() { monthly. Pay=5000; Comm. Rate= 0. 005; } void salesmanager : : pay() { cout<<"请输入"<<employee : : name<<"所管辖部门本月的销售总 额: "; cin>>sales; accum. Pay=monthly. Pay+Comm. Rate*sales; //月薪=固定月薪十销 售提成 cout<<"销售经理"<<name<<"编号"<<individual. Emp. No <<"本月 资"<<accum. Pay<<endl; } void salesmanager: : display. Status() { cout<<"销售经理"<< name<<"编号"<<individual. Emp. No <<"级别为"<<grade<<"级,已付本月 资"<<accum. Pay<<endl; }
void technician: : promote(int) { employee: : promote(2); } void salesman: : promote(int) { employee: : promote(1); } void manager: : promote(int) { employee: : promote(3); } void salesmanager: : promote(int) { employee: : promote(2); }
int main() { manager m 1; technician t 1; salesmanager sm 1; salesman s 1; employee *emp[4]={&m 1, &t 1, &sm 1, &s 1}; //用指针数组存放各个对象的地址 int i; for (i=0; i<4; i++) { emp[i]->promote(); //显示提升信息 emp[i]-> pay(); //显示月薪 emp[i]-> display. Status(); //显示人员信息 } return 0; }
- Slides: 46