C++编程题 关于 继承和多态 的
继承和多态(1)有一个工厂有三类人:固定工资工人、计件工人、计时工人。(2)他们有共同的特征:都有名字、住址。(3)三类员工的工资计算方法不同:固定工资工人,每个月领的工...
继承和多态
(1)有一个工厂有三类人:固定工资工人、计件工人、计时工人。
(2)他们有共同的特征:都有名字、住址。
(3)三类员工的工资计算方法不同:固定工资工人,每个月领的工资是不变的;计件工人根据生产的产品数量计算工资;计时工人根据工作的时间长短计算工资。
(4)在main函数中创建不同的员工,并依次输出每个员工的名字、住址、工资等信息。
(5)程序能体现多态。 展开
(1)有一个工厂有三类人:固定工资工人、计件工人、计时工人。
(2)他们有共同的特征:都有名字、住址。
(3)三类员工的工资计算方法不同:固定工资工人,每个月领的工资是不变的;计件工人根据生产的产品数量计算工资;计时工人根据工作的时间长短计算工资。
(4)在main函数中创建不同的员工,并依次输出每个员工的名字、住址、工资等信息。
(5)程序能体现多态。 展开
5个回答
展开全部
首先你的第一个问题,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()这个函数,找到了,于是绑定成功。
分析完这四句编译器的行为,你就明白了吧。
我写这么多,你好歹多加点分吧……
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()这个函数,找到了,于是绑定成功。
分析完这四句编译器的行为,你就明白了吧。
我写这么多,你好歹多加点分吧……
展开全部
#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;
}
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
让我写我也写不出来,呵呵,我想说是我在学编程还是你在学编程,写一个工人类,里面有个虚函数工资,三类工人通过继承这个类,来重写这个工资函数,其他乱起八糟的一起写进去。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
留下邮箱!
希望能帮到你,哪里不清楚再问。
希望能帮到你,哪里不清楚再问。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
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;
}
...
{
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;
}
...
本回答被网友采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询