1.多态的例子
题目:
某小型公司,主要有四类员工(Employee):经理(Manager)、技术人员(Technician)、销售经理(SalesManager)和推销员(SalesMan)。现在,需要存储这些人员的姓名(name)、编号(id)、当月薪水(salary)。计算月薪总额并显示全部信息。人员编号基数为 1000,每输入一个人员工信息编号顺序加 1。
月薪计算办法是:经理拿固定月薪 8000 元;技术人员按每小时 100 元领取月薪;推销员的月薪按该推销员当月销售额的 4%提成;销售经理既拿固定月薪也领取销售提成,固定月薪为 5000 元,销售提成为所管辖部门当月销售总额的5%。
1 #define _CRT_SECURE_NO_WARNINGS 2 #include<iostream> 3 #include<string> 4 using namespace std; 5 6 //创建一个抽象类 7 class Employee 8 { 9 public: 10 Employee() 11 { 12 inum++; //这里是要点: 当时没有想出来,在写一个变量来接收静态变量的变化值 13 mID = inum; //可以做到当每增加一个员工,它的 ID 会自动 加一。 14 mName = "NoDefined"; 15 mSalary = 0.0; 16 } 17 18 virtual void GetPay() = 0; //不同的计算工资方法; 19 virtual void Show() //在基类中实现出来,如果内容相同,子类就不用再实现了。当时没想到 20 { 21 cout << "姓名:" << mName << " ID:" << mID << " 工资:" << mSalary << endl; 22 } 23 virtual ~Employee(){ } //基类的析构函数一般写成虚继承,可以做到把基类和子类对象一起析构 24 protected: 25 int mID; 26 string mName; 27 double mSalary; 28 static int inum; 29 }; 30 int Employee::inum = 1000; 31 32 //经理 33 class Manager : virtual public Employee 34 { 35 public: 36 Manager(){} 37 Manager(string name) 38 { 39 mName = name; 40 base = 8000; 41 } 42 43 virtual void GetPay() 44 { 45 mSalary = base; 46 } 47 48 protected: 49 double base; 50 }; 51 //技术人员 52 class Technician : public Employee 53 { 54 public: 55 Technician(string name, int hour = 0) 56 { 57 mName = name; 58 mHour = hour; 59 } 60 61 virtual void GetPay() 62 { 63 mSalary = mHour * 100; 64 } 65 protected: 66 int mHour; 67 }; 68 69 //销售人员 70 class SalesMan : virtual public Employee 71 { 72 public: 73 SalesMan(){} 74 SalesMan(string name, double count = 0) 75 { 76 mName = name; 77 mCount = count; 78 } 79 80 virtual void GetPay() 81 { 82 mSalary = mCount * 4 / 100; 83 } 84 protected: 85 double mCount; 86 }; 87 88 //销售经理 89 class SalesManager : public SalesMan, public Manager //此处用了虚继承,解决了二义性,也是重点。 90 { 91 public: 92 SalesManager() 93 { 94 95 } 96 SalesManager(string name, double count) 97 { 98 base = 5000; 99 mName = name; 100 mCount = count; 101 } 102 103 virtual void GetPay() 104 { 105 mSalary = base + mCount * 5 / 100; 106 } 107 }; 108 109 void printInfo(Employee& emp) 110 { 111 emp.GetPay(); 112 emp.Show(); 113 } 114 void test03() 115 { 116 Manager m1("xiaoyong"); 117 Technician t1("xiaoming", 200); 118 SalesMan s1("xiaohong", 80000); 119 SalesManager sm1("xiaoyong", 100000); 120 121 printInfo(m1); 122 printInfo(t1); 123 printInfo(s1); 124 printInfo(sm1); 125 } 126 127 int main() 128 { 129 130 test03(); 131 132 system("pause"); 133 return EXIT_SUCCESS; 134 }
一. 知识点:
1.多态实现的三步:1)有继承, 2)虚函数重写, 3)基类指针或引用指向派生类对象。
2.类中三种属性或变量的初始化:
1.) static 静态成员变量时: (正确写法:在类外初始化:类型 类名::成员名)
2.) const 成员初始化; (正规写法:在类内用初始化列表初始化)
3.) const static 成员初始化: (正确写法:本地初始化;在类内定义的地方初始化)
1 class person{ 2 public: 3 person(int num = 0) : Age(num) "初始化列表" 4 { } 5 void show() 6 { 7 cout<<"Age:"<<Age<<" ID"<<ID<<" size"<<size<<endl; 8 } 9 private: 10 static int ID; "在类外初始化" 11 const int Age; "初始化列表" 12 const static int size = 100; "在本地初始化:即定义的地方" 13 }; 14 int person::ID = 30;
原文:http://www.cnblogs.com/yyx1-1/p/5778200.html