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;
 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;
时间: 2025-01-16 16:53:00

C++的多态例子的相关文章

重载,重写,多态例子

重载 方法重载是让类以统一的方式处理不同类型数据的一种手段.Java的方法重载,就是在类中可以创建多个方法,它们具有相同的名字,但具有不同的参数和不同的定义.调用方法时通过传递给它们的不同个数和类型的参数来决定具体使用哪个方法. package com.wzs; /** * 重载 * * @author Administrator * */ public class OverLoadTest { public int add(int a, int b) { return a + b; } pub

java多态例子

多态存在的三个必要条件一.要有继承:二.要有重写:三.父类引用指向子类对象. 代码部分: class A { public String show(D obj) { return ("A and D"); } public String show(A obj) { return ("A and A"); } } class B extends A { public String show(B obj) { return ("B and B");

c++ 类的继承和多态例子

类的继承例子: 以上个动态银河系的制作为例,假设我们定义了一个星星的类如下: class Star { public: Star(){} ~Star(){} void Init(); void Move(); protected: void Draw(); void NewPos(); void Remove(); double m_x = 0; int m_y; double m_step; int m_color; }; void Star::Init() { if (m_x == 0) {

朔型与多态

1.朔型 java支持隐式转换,以及显式转换.类型转换也叫做朔型.对象的朔比类型转换复杂多,对象只可以被朔型为: 1.该对象的任何一个父类类型 2.对象所属类实现的接口,虽然接口不可以生成对象,但是接口引用可以指向实现了该接口的子对象 3.或者回到自己所在的类,一个对象被朔型成父类后,还可以被朔型回来 当一个对象被朔型成父类后,他提供的方法会减少,但是当把该对象朔型回来后,他又可以使用自身的方法.从而对象朔型并没有改变他的类型,而是暂时将它当作一般的类型. 如果在朔型前和朔型后的类中提供相同的方

多态、抽象类示例

1.一个多态例子 1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 using System.Threading.Tasks; 6 7 namespace _09多态 8 { 9 class Program 10 { 11 static void Main(string[] args) 12 { 13 //概念:让一个对象能够表现出多种的状态(类型) 14

lua面向对象实现(实例化对象、继承、多态、多继承、单例模式)

lua面向对象实现: 一个类就像是一个创建对象的模具.有些面向对象语言提供了类的概念,在这些语言中每个对象都是某个特定类的实例.lua则没有类的概念,每个对象只能自定义行为和形态.不过,要在lua中模拟类也并不困难. lua中,面向对象是用元表这个机制来实现. 首先,一般来说一个表和它的元表是不同的个体(不属于同一个表),在创建新的表时,不会自动创建元表. setmetatable函数:设置元表 setmetatable( 表1 , 表2 )  将表2挂接为表1的元表,并且返回经过挂接后的表1

Python全栈开发,Day7 - 面向对象学习

本章内容 面向对象编程介绍 面向对象开发 面向对象的特性 一.面向对象编程介绍 介绍之前,先说一个例子: 你的老板要你做一款枪战游戏,游戏里面有很多的角色,比如CF里面的潜伏者和保卫者,在游戏里还有很多的玩家,每个玩家都有不同的名字和装扮,但是你发现这些玩家同一个阵容(潜伏者.保卫者)里的玩家具有很多相同的属性,于是你开始写代码,首先定义潜伏者1,名字.武器......等,然后保卫者1,同样,名字.武器......:代码如下: 1 def defenders(name,weapon,*args)

C语言的设计模式-面向对象机制的实现(一)

C语言的设计模式-面向对象机制的实现(一) 为什么要用C来模拟面向对象的机制,在实际的工作中我们往往在感慨一些面向对象的经典设计模式由于C语言的限制无法使用,其实通过简单的模拟面向对象的行为,在C语言中也可以使用这些模式. 1:类的构建 类描述了所创建的对象共同的属性和方法.我们在一个源文件中通过把数据和操作进行适当的组织来完成类的模拟. /*类的数据*/typedef struct SQUARE_S SQUARE_T; struct SQUARE_S { void (*draw)(void*)

用C语言实现面向对象的开发

C语言的对象化模型 面向对象的特征主要包括: .封装,隐藏内部实现 .继承,复用现有代码 .多态,改写对象行为 采用C语言实现的关键是如何运用C语言本身的特性来实现上述面向对象的特征. 1.1 封装 封装是一种信息隐蔽技术,它体现于类的说明,是对象的重要特性.封装使数据和加工该数据的 方法(函数)封装为一个整体,以实现独立性很强的模块,使得用户只能见到对象的外特性(对象 能接受哪些消息,具有那些处理能力),而对象的内特性(保存内部状态的私有数据和实现加工能 力的算法)对用户是隐蔽的.封装的目的在