C++编程题 关于 继承和多态 的

继承和多态(1)有一个工厂有三类人:固定工资工人、计件工人、计时工人。(2)他们有共同的特征:都有名字、住址。(3)三类员工的工资计算方法不同:固定工资工人,每个月领的工... 继承和多态
(1)有一个工厂有三类人:固定工资工人、计件工人、计时工人。
(2)他们有共同的特征:都有名字、住址。
(3)三类员工的工资计算方法不同:固定工资工人,每个月领的工资是不变的;计件工人根据生产的产品数量计算工资;计时工人根据工作的时间长短计算工资。
(4)在main函数中创建不同的员工,并依次输出每个员工的名字、住址、工资等信息。
(5)程序能体现多态。
展开
 我来答
米亦巧藏涵
2020-01-01 · TA获得超过3万个赞
知道大有可为答主
回答量:1.1万
采纳率:31%
帮助的人:688万
展开全部
首先你的第一个问题,d.vf2();这里涉及到一个c++的原则,子类有父类的同名函数,如果不是虚函数的话,则会“隐藏”父类的函数,不管参数是否一致,都会隐藏!所以你的dd::vf2(int
i)这个函数就把bb::vf2()隐藏了,因此dd就不会继承这个函数。至于为什么这么设计,以前貌似看某处b.s的访谈,说为了减小出错的几率,以免子类的使用者不小心误使用了父类的函数。
看起来貌似第二个问题和第一个问题是一样的,但是结果却不同,其实你应该去了解下c++的对象模型,你就知道它的运作机理了。
对于虚函数,是动态绑定的,在对象内部有一个虚函数表,表里面是一个个的函数指针,指向当前对象的各个虚函数真正的代码,当你代码执行到调用虚函数那里的时候,会去这个表里面查,然后取出函数指针再调用。
如果是非虚函数,则是静态绑定的,也就是说在编译的时候就已经确定要调用哪个函数!
不管b::vf2、d::vf2、d::vf3都是非虚函数,都会发生静态绑定。
也就是说编译器在编译代码的时候就会决定到底调用哪个函数。它怎么决定呢?看类型。如下:
bp->vf2();
//这句话,编译器看到了bp是b*类型的,于是就去找b::vf2()这个函数,找到了于是绑定成功。
d.vf2();
//这句话,编译器看到d是d类型的,于是去找d::vf2()这个函数,由于上面提到的隐藏原则,d不存在这个函数,于是没找到,出错。
dp->vf2();
//这句话,编译器看到dp是d*类型的,去找d::vf2()这个函数,于是同上,找不到,出错。
dp->vf3();//编译器看到dp是d*类型的,于是找d::vf3()这个函数,找到了,于是绑定成功。
分析完这四句编译器的行为,你就明白了吧。
我写这么多,你好歹多加点分吧……
outspaceman19
推荐于2016-10-29 · TA获得超过1080个赞
知道小有建树答主
回答量:749
采纳率:100%
帮助的人:412万
展开全部
#include <iostream>
#include <string.h>
using namespace std;
class Worker
{
public:
 char name[50];
 char address[200];
 int salary;
 Worker(char* name, char* address){
  memset(this->name, 0, 50);
  memcpy(this->name,name,strlen(name));
  memset(this->address, 0, 200);
  memcpy(this->address, address, strlen(address));
 }
 virtual ~Worker(){}
 void printInfo()
 {
  cout<<"name:"<<name<<",address:"<<address<<",salary:"<<salary<<endl;
 }
};
class AWorker : public Worker
{
public:
 AWorker(char* name,char* address, int salary):Worker(name,address){this->salary = salary;}
};
class BWorker : public Worker
{
public:
 BWorker(char* name,char* address,int total_numbers, int every):Worker(name,address){this->salary = total_numbers*every;}
};
class CWorker : public Worker
{
public:
 CWorker(char* name,char* address,int total_hours, int every):Worker(name,address){this->salary = total_hours*every;}
};
int main()
{
 Worker* w = NULL;
 w=new AWorker((char*)"A Worker", (char*)"A address", 2000);
 w->printInfo();
 w=new BWorker((char*)"B Worker", (char*)"B address", 100,15);
 w->printInfo();
 w=new CWorker((char*)"C Worker", (char*)"C address", 80, 30);
 w->printInfo();
 return 0;
}
本回答被提问者采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
498700596
2013-06-05 · TA获得超过596个赞
知道小有建树答主
回答量:410
采纳率:100%
帮助的人:332万
展开全部
让我写我也写不出来,呵呵,我想说是我在学编程还是你在学编程,写一个工人类,里面有个虚函数工资,三类工人通过继承这个类,来重写这个工资函数,其他乱起八糟的一起写进去。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
百度网友cd3d6c4
2013-06-05 · TA获得超过315个赞
知道小有建树答主
回答量:262
采纳率:0%
帮助的人:280万
展开全部
留下邮箱!

希望能帮到你,哪里不清楚再问。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
twicave
2013-06-05 · TA获得超过517个赞
知道小有建树答主
回答量:198
采纳率:0%
帮助的人:57.4万
展开全部
class Worker
{
public:
Worker(string name, string addr);
string name();
string addr();
virtual int salary();
};
class WorkerWithFixedSalary : public Worker
{
void setSalary();
virtual int salary() { return _salary;}
int _salary;
}
...
本回答被网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(3)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式