C++小白..求调教

zhizhi1991 2012-05-07 07:40:16
#include<iostream>
#include<string>
using namespace std;
class Employee
{
protected:
string name;
string ID;
public:
Employee(){};
virtual void set()=0;
virtual void show()=0;


~Employee(){};
};


class Manager:public Employee
{
private:
double salary;
public:
Manager(){};
void set(string n,string i,double s)
{

name=n;
ID=i;
salary=s;
};

void show()
{ cout<<"Manager"<<endl;
cout<<"name:"<<name<<endl;
cout<<"ID:"<<ID<<endl;
cout<<"salary:"<<salary<<endl;

};

~Manager(){};
};

void main()
{ Employee *p;
Manager m;
p=&m;
p->set("a","1001",3000);
p->show();

}
...全文
223 23 打赏 收藏 转发到动态 举报
写回复
用AI写文章
23 条回复
切换为时间正序
请发表友善的回复…
发表回复
zhizhi1991 2012-05-07
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 的回复:]

employee里面有两个蠢虚函数没有定义
[/Quote]是指没在派生类里定义?
zhizhi1991 2012-05-07
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 的回复:]

抽象类不能定义对象的。
[/Quote]嗯嗯,这个我知道,但我派生出来的manager也是抽象类吗?
wininternal 2012-05-07
  • 打赏
  • 举报
回复
employee里面有两个蠢虚函数没有定义
zhizhi1991 2012-05-07
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 的回复:]

virtual void set()=0;
void set(string n,string i,double s)

一般来说同名函数不同参数列表,派生类会覆盖基类函数
但基类是纯虚函数的话,似乎不适用这一规则
结果就是,派生类中的set()函数依然没有被实现
[/Quote]我把set的参数表置空以后就编译通过了,费解,不明白为什么
zhz950209 2012-05-07
  • 打赏
  • 举报
回复
抽象类不能定义对象的。
baichi4141 2012-05-07
  • 打赏
  • 举报
回复
virtual void set()=0;
void set(string n,string i,double s)

一般来说同名函数不同参数列表,派生类会覆盖基类函数
但基类是纯虚函数的话,似乎不适用这一规则
结果就是,派生类中的set()函数依然没有被实现
baichi4141 2012-05-07
  • 打赏
  • 举报
回复
错误提示已经说得很明白了
不能定义一个抽象类的对象

原因在于你定义了“virtual void set()=0;”这样的纯虚函数,除非某个派生类中实现了这个函数的具体功能,否则它的所有派生类都和它本身一样是抽象类,不能用于定义对象
zhizhi1991 2012-05-07
  • 打赏
  • 举报
回复
求解呀。。求解呀。。大神们
zhizhi1991 2012-05-07
  • 打赏
  • 举报
回复
也不行还是这个问题[Quote=引用 3 楼 的回复:]

Manager中的set和show前面加virtual
[/Quote]
litter_man 2012-05-07
  • 打赏
  • 举报
回复
Manager中的set和show前面加virtual
litter_man 2012-05-07
  • 打赏
  • 举报
回复
说人话
zhizhi1991 2012-05-07
  • 打赏
  • 举报
回复
编译之后一直是
error C2259: 'Manager' : cannot instantiate abstract class due to following members:
see declaration of 'Manager'
各位大神..求解这是什么情况
zhizhi1991 2012-05-07
  • 打赏
  • 举报
回复
[Quote=引用 22 楼 的回复:]

子类必须实现父类的纯虚函数,否则不能实例化;
子类如果重载父类的方法,结果会把父类方法覆盖,不知道你的子类中的set方法是要重载还是怎么样,这一点你也要注意。
[/Quote]好的,谢谢
lth105 2012-05-07
  • 打赏
  • 举报
回复
子类必须实现父类的纯虚函数,否则不能实例化;
子类如果重载父类的方法,结果会把父类方法覆盖,不知道你的子类中的set方法是要重载还是怎么样,这一点你也要注意。
zhizhi1991 2012-05-07
  • 打赏
  • 举报
回复
恩恩..这样是对的..不过就没办法用基类指针调用派生类的函数了..不过同样谢谢呀[Quote=引用 15 楼 的回复:]

#include<iostream>
#include<string>
using namespace std;
class Employee
{
protected:
string name;
string ID;
public:
virtual void show()=0;
};

class Manager:public Employee
{……
[/Quote]
zhizhi1991 2012-05-07
  • 打赏
  • 举报
回复
[Quote=引用 18 楼 的回复:]

基类virtual void set()=0这个方法为纯虚函数,但是你在子类Manager中却实现了void set(string n,string i,double s)这个方法,并没有实现virtual void set()=0,所以子类Manager还是一个抽象类,是不能实例化的
[/Quote]嗯嗯,谢谢
zhizhi1991 2012-05-07
  • 打赏
  • 举报
回复
[Quote=引用 17 楼 的回复:]

Employee中的定义改为virtual void set()=0;改为void set(string n,string i,double s)=0;就达到你想要的结果了
[/Quote]哇,这个一针见血,哈哈,谢谢呀
link344 2012-05-07
  • 打赏
  • 举报
回复
基类virtual void set()=0这个方法为纯虚函数,但是你在子类Manager中却实现了void set(string n,string i,double s)这个方法,并没有实现virtual void set()=0,所以子类Manager还是一个抽象类,是不能实例化的
「已注销」 2012-05-07
  • 打赏
  • 举报
回复
Employee中的定义改为virtual void set()=0;改为void set(string n,string i,double s)=0;就达到你想要的结果了

zhz950209 2012-05-07
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 的回复:]

引用 13 楼 的回复:

引用 11 楼 的回复:

引用 8 楼 的回复:

抽象类不能定义对象的。
嗯嗯,这个我知道,但我派生出来的manager也是抽象类吗?

主函数里面不是定义了一个employee的对象么。
我是想用基类的指针调用派生类的函数
[/Quote]
那就不要弄抽象类。
加载更多回复(3)

64,637

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧