C++的多态例子
2016-08-16 22:55
169 查看
1.多态的例子
题目:
某小型公司,主要有四类员工(Employee):经理(Manager)、技术人员(Technician)、销售经理(SalesManager)和推销员(SalesMan)。现在,需要存储这些人员的姓名(name)、编号(id)、当月薪水(salary)。计算月薪总额并显示全部信息。人员编号基数为1000,每输入一个人员工信息编号顺序加1。
月薪计算办法是:经理拿固定月薪8000元;技术人员按每小时100元领取月薪;推销员的月薪按该推销员当月销售额的4%提成;销售经理既拿固定月薪也领取销售提成,固定月薪为5000元,销售提成为所管辖部门当月销售总额的5%。
一.知识点:
1.多态实现的三步:1)有继承,2)虚函数重写,3)基类指针或引用指向派生类对象。
2.要想让多态显实现不同的功能,一定记得要把基类的函数调用起来(或者让你想使用的那个变量的函数调用起来,)不要忘记调用,或少调用了。
3.类中三种属性或变量的初始化:
1.)static静态成员变量时:(正确写法:在类外初始化:类型类名::成员名)
2.)const成员初始化; (正规写法:在类内用初始化列表初始化)
3.)conststatic成员初始化: (正确写法:本地初始化;在类内定义的地方初始化)
2.设计一个基类Shape包含成员函数Show(),将Show()声明为纯虚函数。
Shape类公有派生矩形类Square(正方形)和圆类Circle(圆形),
问题1:分别定义Show()实现其主要集合元素的显示。使用抽象类Shape
类型的指针,当它指向某个派生类的对象时,就可以通过访问该对象的虚函数
成员Show()。
问题2:用ShowArea()分别显示各种图形的面积.最后还要显示所有图形
的各个面积。要求积累指针数组,数组的每个元素指向一个派生类对象。
题目:
某小型公司,主要有四类员工(Employee):经理(Manager)、技术人员(Technician)、销售经理(SalesManager)和推销员(SalesMan)。现在,需要存储这些人员的姓名(name)、编号(id)、当月薪水(salary)。计算月薪总额并显示全部信息。人员编号基数为1000,每输入一个人员工信息编号顺序加1。
月薪计算办法是:经理拿固定月薪8000元;技术人员按每小时100元领取月薪;推销员的月薪按该推销员当月销售额的4%提成;销售经理既拿固定月薪也领取销售提成,固定月薪为5000元,销售提成为所管辖部门当月销售总额的5%。
#define_CRT_SECURE_NO_WARNINGS #include<iostream> #include<string> usingnamespacestd; //创建一个抽象类 classEmployee { public: Employee() { inum++;//这里是要点:当时没有想出来,在写一个变量来接收静态变量的变化值 mID=inum;//可以做到当每增加一个员工,它的ID会自动加一。 mName="NoDefined"; mSalary=0.0; } virtualvoidGetPay()=0;//不同的计算工资方法; virtualvoidShow()//在基类中实现出来,如果内容相同,子类就不用再实现了。当时没想到 { cout<<"姓名:"<<mName<<"ID:"<<mID<<"工资:"<<mSalary<<endl; } virtual~Employee(){}//基类的析构函数一般写成虚继承,可以做到把基类和子类对象一起析构 protected: intmID; stringmName; doublemSalary; staticintinum;//员工ID的基数,每进一个员工,在基数上加一,就为它的ID。 }; intEmployee::inum=1000; //经理 classManager:virtualpublicEmployee { public: Manager(){} Manager(stringname) { mName=name; base=8000; } virtualvoidGetPay() { mSalary=base; } protected: doublebase; }; //技术人员 classTechnician:publicEmployee { public: Technician(stringname,inthour=0) { mName=name; mHour=hour; } virtualvoidGetPay() { mSalary=mHour*100; } protected: intmHour; }; //销售人员 classSalesMan:virtualpublicEmployee { public: SalesMan(){} SalesMan(stringname,doublecount=0) { sum+=count; mName=name; mCount=count; } virtualvoidGetPay() { mSalary=mCount*4/100; } protected: doublemCount; staticdoublesum;//累加每个销售的业绩,然后传递给派生类。(经典) }; doubleSalesMan::sum=0; //销售经理(多继承,要点是:虚继承(解决二义性))。 classSalesManager:publicSalesMan,publicManager//此处用了虚继承,解决了二义性,也是重点。 { public: SalesManager() { } SalesManager(stringname) { base=5000; mName=name; } virtualvoidGetPay() { mSalary=base+sum*5/100; cout<<"销售总额"<<sum<<endl; } }; voidprintInfo(Employee&emp) { emp.GetPay(); emp.Show(); } voidtest03() { Managerm1("xiaoyong"); Techniciant1("xiaoming",200); SalesMans1("xiaohong",80000); SalesMans2("xiaohong",10000); SalesManagersm1("xiaoyong"); printInfo(m1); printInfo(t1); printInfo(s1); printInfo(sm1); } intmain03() { test03(); system("pause"); returnEXIT_SUCCESS; }
一.知识点:
1.多态实现的三步:1)有继承,2)虚函数重写,3)基类指针或引用指向派生类对象。
2.要想让多态显实现不同的功能,一定记得要把基类的函数调用起来(或者让你想使用的那个变量的函数调用起来,)不要忘记调用,或少调用了。
3.类中三种属性或变量的初始化:
1.)static静态成员变量时:(正确写法:在类外初始化:类型类名::成员名)
2.)const成员初始化; (正规写法:在类内用初始化列表初始化)
3.)conststatic成员初始化: (正确写法:本地初始化;在类内定义的地方初始化)
classperson{
public:
person(intnum=0):Age(num)"初始化列表"
{}
voidshow()
{
cout<<"Age:"<<Age<<"ID"<<ID<<"size"<<size<<endl;
}
private:
staticintID;"在类外初始化"
constintAge;"初始化列表"
conststaticintsize=100;"在本地初始化:即定义的地方"
};
intperson::ID=30;
2.设计一个基类Shape包含成员函数Show(),将Show()声明为纯虚函数。
Shape类公有派生矩形类Square(正方形)和圆类Circle(圆形),
问题1:分别定义Show()实现其主要集合元素的显示。使用抽象类Shape
类型的指针,当它指向某个派生类的对象时,就可以通过访问该对象的虚函数
成员Show()。
问题2:用ShowArea()分别显示各种图形的面积.最后还要显示所有图形
的各个面积。要求积累指针数组,数组的每个元素指向一个派生类对象。
#define_CRT_SECURE_NO_WARNINGS
#include<iostream>
usingnamespacestd;
constdoublePI=3.14;
//基类
classshape
{
public:
virtualvoidshow()=0; //显示各类基本元素
virtualvoidshowArea()=0; //显示面积
virtualvoidCaculate()=0; //面积算法
~shape(){}
};
//正方形
classSquare:publicshape
{
public:
Square()
{
Lenth=0;
Width=0;
}
Square(doublelenth,doublewidth)
{
Lenth=lenth;
Width=width;
}
virtualvoidshow()
{
cout<<"Lenth:"<<Lenth<<"Width"<<Width<<endl;
}
virtualvoidshowArea()
{
cout<<"SquareArea:"<<SquareArea<<endl;
}
virtualvoidCaculate()
{
SquareArea=Lenth*Width;
}
private:
doubleLenth;
doubleWidth;
doubleSquareArea;
};
//圆形
classCircle:publicshape
{
public:
Circle(){Radius=0;}
Circle(doubleradius)
{
Radius=radius;
}
virtualvoidshow()
{
cout<<"半径:"<<Radius<<endl;
}
virtualvoidshowArea()
{
cout<<"CircleArea"<<CircleArea<<endl;
}
virtualvoidCaculate()
{
CircleArea=PI*Radius*Radius;
}
private:
doubleRadius;
doubleCircleArea;
};
voidprintNews(shape&sp)
{
sp.Caculate();
sp.show();
sp.showArea();
}
voidtest03()
{
Squaresq1(5,4);
Circlecr1(7);
Squaresq2;
printNews(sq1);
printNews(cr1);
printNews(sq2);
}
intmain03()
{
test03();
system("pause");
returnEXIT_SUCCESS;
}
相关文章推荐
- C++学习------强制多态的例子
- 关于C++多态的一个例子
- C++学习------包含多态的例子
- c++——多态、继承、运算符重载综合例子代码
- 一个很短但能够体现C++的多态的例子
- 用例子来理解c++的类,构造函数,类的多态,成员函数,成员变量
- C++继承和多态例子
- 简单例子:C++多态
- C++多态是如何实现的——一个简单明晰的例子告诉你!
- C++学习------过载多态的例子
- 多态例子——Java和C++实现
- C++多态解释与例子
- C++ 虚函数,多态的两个例子
- C++ 多态(polymorphism)的例子
- C++之多态的一个例子
- C++学习------参数多态的例子
- C++ 派生例子 多态 虚函数
- 学习c++多态的几个小例子
- c++继承与多态经典例子【转自网络大神】
- C++对象布局及多态实现探索之内存布局