• C++的多态例子


    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;            //员工ID的基数,每进一个员工,在基数上加一,就为它的ID。
     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         sum += count;
     77         mName = name;
     78         mCount = count;
     79     }
     80     
     81     virtual void GetPay()
     82     {
     83         mSalary = mCount * 4 / 100;
     84     }
     85 protected:
     86     double mCount;
     87     static double sum;                //累加每个销售的业绩,然后传递给派生类。    (经典)
     88 };
     89 double SalesMan::sum = 0;
     90 
     91 //销售经理(多继承,要点是: 虚继承(解决二义性))。
     92 class SalesManager : public SalesMan, public Manager        //此处用了虚继承,解决了二义性,也是重点。
     93 {
     94 public:
     95     SalesManager()
     96     {
     97         
     98     }
     99     SalesManager(string name)
    100     {
    101         base = 5000;
    102         mName = name;
    103         
    104     }
    105     
    106     virtual void GetPay()
    107     {
    108         mSalary = base + sum * 5 / 100;
    109         cout << "销售总额" << sum << endl;
    110     }
    111 };
    112 
    113 void printInfo(Employee& emp)
    114 {
    115     emp.GetPay();
    116     emp.Show();
    117 }
    118 void test03()
    119 {
    120     Manager m1("xiaoyong");
    121     Technician t1("xiaoming", 200);
    122     SalesMan s1("xiaohong", 80000);
    123     SalesMan s2("xiaohong", 10000);
    124 
    125     SalesManager sm1("xiaoyong");
    126 
    127     printInfo(m1);
    128     printInfo(t1);
    129     printInfo(s1);
    130     printInfo(sm1);
    131 }
    132 
    133 int main03()
    134 {
    135 
    136     test03();
    137 
    138     system("pause");
    139     return EXIT_SUCCESS;
    140 }
    
    
    
     

    一. 知识点:

    1.多态实现的三步:1)有继承, 2)虚函数重写, 3)基类指针或引用指向派生类对象。

    2.要想让多态显实现不同的功能,一定记得要把基类的函数调用起来(或者让你想使用的那个变量的函数调用起来,)不要忘记调用,或少调用了。

    3.类中三种属性或变量的初始化:

      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;

    2.设计一个基类Shape包含成员函数Show(), 将Show()声明为纯虚函数。
    Shape类公有派生矩形类Square(正方形)和圆类Circle(圆形),
    问题1: 分别定义Show()实现其主要集合元素的显示。使用抽象类Shape
    类型的指针,当它指向某个派生类的对象时,就可以通过访问该对象的虚函数
    成员Show()。
    问题2:用ShowArea()分别显示各种图形的面积.最后还要显示所有图形
    的各个面积。要求积累指针数组,数组的每个元素指向一个派生类对象。

     1 #define _CRT_SECURE_NO_WARNINGS
     2 #include<iostream>
     3 using namespace std;
     4 const double PI = 3.14;
      //基类
    5 class shape 6 { 7 public: 8 virtual void show() = 0;    //显示各类基本元素 9 virtual void showArea() = 0;  //显示面积 10 virtual void Caculate() = 0;  //面积算法 11 ~shape(){ } 12 }; 13 //正方形 14 class Square : public shape 15 { 16 public: 17 Square() 18 { 19 Lenth = 0; 20 Width = 0; 21 } 22 Square(double lenth, double width) 23 { 24 Lenth = lenth; 25 Width = width; 26 } 27 virtual void show() 28 { 29 cout << "Lenth:" << Lenth << " Width" << Width << endl; 30 } 31 virtual void showArea() 32 { 33 cout << "SquareArea:" << SquareArea << endl; 34 } 35 virtual void Caculate() 36 { 37 SquareArea = Lenth * Width; 38 } 39 private: 40 double Lenth; 41 double Width; 42 double SquareArea; 43 }; 44 45 //圆形 46 class Circle : public shape 47 { 48 public: 49 Circle(){ Radius = 0; } 50 Circle(double radius) 51 { 52 Radius = radius; 53 } 54 virtual void show() 55 { 56 cout << "半径:" << Radius << endl; 57 } 58 virtual void showArea() 59 { 60 cout << "CircleArea" << CircleArea << endl; 61 } 62 virtual void Caculate() 63 { 64 CircleArea = PI * Radius * Radius; 65 } 66 private: 67 double Radius; 68 double CircleArea; 69 }; 70 71 72 void printNews(shape& sp) 73 { 74 sp.Caculate(); 75 sp.show(); 76 sp.showArea(); 77 78 } 79 80 void test03() 81 { 82 Square sq1(5, 4); 83 Circle cr1(7); 84 Square sq2; 85 printNews(sq1); 86 printNews(cr1); 87 printNews(sq2); 88 89 } 90 91 int main03() 92 { 93 94 test03(); 95 96 system("pause"); 97 return EXIT_SUCCESS; 98 }
  • 相关阅读:
    shared_ptr weak_ptr boost 内存管理
    _vimrc win7 gvim
    qt 拖放
    数学小魔术 斐波那契数列
    qt4 程序 移植到 qt5
    (转)字符串匹配算法总结
    c++11
    BM 字符串匹配
    编译qt5 demo
    c++ 类库 学习资源
  • 原文地址:https://www.cnblogs.com/yyx1-1/p/5778200.html
Copyright © 2020-2023  润新知