1.多态的例子

题目:

某小型公司,主要有四类员工(Employee):经理(Manager)、技术人员(Technician)、销售经理(SalesManager)和推销员(SalesMan)。现在,需要存储这些人员的姓名(name)、编号(id)、当月薪水(salary)。计算月薪总额并显示全部信息。人员编号基数为 1000,每输入一个人员工信息编号顺序加 1。

月薪计算办法是:经理拿固定月薪 8000 元;技术人员按每小时 100 元领取月薪;推销员的月薪按该推销员当月销售额的 4%提成;销售经理既拿固定月薪也领取销售提成,固定月薪为 5000 元,销售提成为所管辖部门当月销售总额的5%。


 #define _CRT_SECURE_NO_WARNINGS
#include<iostream>
#include<string>
using namespace std; //创建一个抽象类
class Employee
{
public:
Employee()
{
inum++; //这里是要点: 当时没有想出来,在写一个变量来接收静态变量的变化值
mID = inum; //可以做到当每增加一个员工,它的 ID 会自动 加一。
mName = "NoDefined";
mSalary = 0.0;
} virtual void GetPay() = ; //不同的计算工资方法;
virtual void Show() //在基类中实现出来,如果内容相同,子类就不用再实现了。当时没想到
{
cout << "姓名:" << mName << " ID:" << mID << " 工资:" << mSalary << endl;
}
virtual ~Employee(){ } //基类的析构函数一般写成虚继承,可以做到把基类和子类对象一起析构
protected:
int mID;
string mName;
double mSalary;
static int inum; //员工ID的基数,每进一个员工,在基数上加一,就为它的ID。
};
int Employee::inum = ; //经理
class Manager : virtual public Employee
{
public:
Manager(){}
Manager(string name)
{
mName = name;
base = ;
} virtual void GetPay()
{
mSalary = base;
} protected:
double base;
};
//技术人员
class Technician : public Employee
{
public:
Technician(string name, int hour = )
{
mName = name;
mHour = hour;
} virtual void GetPay()
{
mSalary = mHour * ;
}
protected:
int mHour;
}; //销售人员
class SalesMan : virtual public Employee
{
public:
SalesMan(){}
SalesMan(string name, double count = )
{
sum += count;
mName = name;
mCount = count;
} virtual void GetPay()
{
mSalary = mCount * / ;
}
protected:
double mCount;
static double sum; //累加每个销售的业绩,然后传递给派生类。 (经典)
};
double SalesMan::sum = ; //销售经理(多继承,要点是: 虚继承(解决二义性))。
class SalesManager : public SalesMan, public Manager //此处用了虚继承,解决了二义性,也是重点。
{
public:
SalesManager()
{ }
SalesManager(string name)
{
base = ;
mName = name; } virtual void GetPay()
{
mSalary = base + sum * / ;
cout << "销售总额" << sum << endl;
}
}; void printInfo(Employee& emp)
{
emp.GetPay();
emp.Show();
}
void test03()
{
Manager m1("xiaoyong");
Technician t1("xiaoming", );
SalesMan s1("xiaohong", );
SalesMan s2("xiaohong", ); SalesManager sm1("xiaoyong"); printInfo(m1);
printInfo(t1);
printInfo(s1);
printInfo(sm1);
} int main03()
{ test03(); system("pause");
return EXIT_SUCCESS;
}

 

一. 知识点:

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

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

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

  1.) static 静态成员变量时: (正确写法:在类外初始化:类型 类名::成员名)
  2.) const 成员初始化; (正规写法:在类内用初始化列表初始化)
  3.) const static 成员初始化: (正确写法:本地初始化;在类内定义的地方初始化)

 class person{
public:
person(int num = ) : Age(num) "初始化列表"
{ }
void show()
{
cout<<"Age:"<<Age<<" ID"<<ID<<" size"<<size<<endl;
}
private:
static int ID; "在类外初始化"
const int Age; "初始化列表"
const static int size = ; "在本地初始化:即定义的地方"
};
int person::ID = ;

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

 #define _CRT_SECURE_NO_WARNINGS
#include<iostream>
using namespace std;
const double PI = 3.14;
  //基类
class shape
{
public:
virtual void show() = ;    //显示各类基本元素
virtual void showArea() = ;  //显示面积
virtual void Caculate() = ;  //面积算法
~shape(){ }
};
//正方形
class Square : public shape
{
public:
Square()
{
Lenth = ;
Width = ;
}
Square(double lenth, double width)
{
Lenth = lenth;
Width = width;
}
virtual void show()
{
cout << "Lenth:" << Lenth << " Width" << Width << endl;
}
virtual void showArea()
{
cout << "SquareArea:" << SquareArea << endl;
}
virtual void Caculate()
{
SquareArea = Lenth * Width;
}
private:
double Lenth;
double Width;
double SquareArea;
}; //圆形
class Circle : public shape
{
public:
Circle(){ Radius = ; }
Circle(double radius)
{
Radius = radius;
}
virtual void show()
{
cout << "半径:" << Radius << endl;
}
virtual void showArea()
{
cout << "CircleArea" << CircleArea << endl;
}
virtual void Caculate()
{
CircleArea = PI * Radius * Radius;
}
private:
double Radius;
double CircleArea;
}; void printNews(shape& sp)
{
sp.Caculate();
sp.show();
sp.showArea(); } void test03()
{
Square sq1(, );
Circle cr1();
Square sq2;
printNews(sq1);
printNews(cr1);
printNews(sq2); } int main03()
{ test03(); system("pause");
return EXIT_SUCCESS;
}

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

  1. java多态例子

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

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

    类的继承例子: 以上个动态银河系的制作为例,假设我们定义了一个星星的类如下: class Star { public: Star(){} ~Star(){} void Init(); void Mov ...

  3. C++多态例子_虚函数

    #include<iostream> using namespace std; class parent { public: virtual void fun() { cout <& ...

  4. Java的多态及注意事项

    什么是多态: 多态不但能够改善代码的组织结构和可读性,还能够创建可扩展的程序.在Java中,所有的方法都是通过动态绑定实现多态的.将一个方法调用同一个方法主体关联起来被称作绑定.动态绑定的含义是在运行 ...

  5. Java的多态浅谈

    概述 Java的四大基本特性:抽象,封装,继承和多态.其中,抽象,封装,继承可以说多态的基础,而多态是封装,继承的具体表现.如果非要用专业术语来描述什么是多态的话 多态是指程序中定义的引用变量所指向具 ...

  6. Java——多态浅析

    前言 在面向对象程序设计语言中,多态是继数据抽象和继承之后的第三种基本特性.多态的含义是什么,有什么作用以及在Java中是怎么实现的?下面将做介绍. 什么是多态 简单点说就是"一个接口,多种 ...

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

    lua面向对象实现: 一个类就像是一个创建对象的模具.有些面向对象语言提供了类的概念,在这些语言中每个对象都是某个特定类的实例.lua则没有类的概念,每个对象只能自定义行为和形态.不过,要在lua中模 ...

  8. Java多态的6大特性|乐字节

    大家好,我是乐字节的小乐,前几天讲完了Java继承,接下来我们会讲述Java多态. 以上就是本次学习的6大任务.我们依次来看. 一. Object类 Object类是所有Java类的根基类. 如果在类 ...

  9. python基础之面向对象(二)(封装、继承、多态)

    一.封装 (1)封装是面向对象的一大特点 (2)面向对象编程的第一步--将属性和方法封装到一个抽象的类当中 (3)外界使用类创建对象,然后让对象调用方法 (4)对象方法的细节都被封装在类的内部 1.案 ...

随机推荐

  1. Java学习笔记(13)

    StringBuffer 增加 append(boolean b)    可以添加任意类型的数据到容器中 insert(int offset,boolean b)  指定插入的索引值,插入对应的内容  ...

  2. HDU 5626 Clarke and points 平面两点曼哈顿最远距离

    Clarke and points 题目连接: http://acm.hdu.edu.cn/showproblem.php?pid=5626 Description Clarke is a patie ...

  3. (转)同步IO 异步IO 阻塞IO 非阻塞IO

    同步(synchronous) IO和异步(asynchronous) IO,阻塞(blocking) IO和非阻塞(non-blocking)IO分别是什么,到底有什么区别?这个问题其实不同的人给出 ...

  4. Objective-C字面量语法总结

    通常情况下,创建数组,字典的时候需要写一些很长的方法名,今天就总结一下如何使用字面量语法代替这些方法. 1.数值的创建 NSNumber *number1 = [NSNumber numberWith ...

  5. [Android自定义控件] Android Scroller工具类和GestureDetector的简单用法

    转载:http://ipjmc.iteye.com/blog/1615828 Android里Scroller类是为了实现View平滑滚动的一个Helper类.通常在自定义的View时使用,在View ...

  6. 关于Java代码优化的44条建议!

    关于Java代码优化的N条建议! 本文是作者:五月的仓颉 结合自己的工作和平时学习的体验重新谈一下为什么要进行代码优化.在修改之前,作者的说法是这样的: 就像鲸鱼吃虾米一样,也许吃一个两个虾米对于鲸鱼 ...

  7. LaTeX 相对于 Word 有什么优势?

    sjhstone ,本科EE在读 vczh等 276 人赞同 [Word公式进阶请往下翻]有人还写过论文,参见PLOS ONE: An Efficiency Comparison of Documen ...

  8. ActionError,ActionMessage推荐

    尽管Struts框架供给了管用的失常处理机制,但不能保证处理所有的讹谬,这时Struts框架会把讹谬抛给Web容器,在默认情形下Web容器会向用户博览器直接归来原始消息.万一想避免直接让用户看到这些原 ...

  9. SQL中inner join,outer join和cross join的区别

    使用join连表,缺陷的情况下是inner join,开发中使用的left join和right join属于outer join,outer join还包括full join 现有两张表,Table ...

  10. Android之旅七 Service简介

    1.          Service是什么:它是一个应用程序组件.没有图形化界面.通常用来处理一些耗时比较长的操作(例如下载.播放MP3等等).可以使用Service更新ContentProvide ...