我在通过我的类传递两条数据时遇到问题,特别是 ID 和 Name。我知道,如果不遍历之前的父类,就无法调用基类构造函数,但我很难弄清楚为什么这不起作用,我是否需要一直构造函数,或者我可以在末尾添加它吗?我的班级创建像基班一样吗?
class CEmployee
{
private:
char m_name[30];
char m_id[30];
//virtual float Pay() { return 0;}; // virtual function
virtual float Pay() = 0; // pure virtual function
public:
CEmployee(char name[], char id[])
{
strcpy_s(m_name, name);
strcpy_s(m_id, id);
}
CEmployee()
{
strcpy_s(m_name, "");
strcpy_s(m_id, "");
}
void PrintCheck()
{
cout << m_name << " " << Pay() << endl;
}
};
class CFulltimeEmployee : public CEmployee
{
protected:
static float m_benefitcost;
public:
CFulltimeEmployee()
{
}
CFulltimeEmployee(char name[], char id[]) : CEmployee (name, id)
{
m_benefitcost = 100;
}
};
float CFulltimeEmployee::m_benefitcost = 100;
class CHourlyFTEmployee : public CFulltimeEmployee
{
private:
float m_rate;
float m_hours;
public:
CHourlyFTEmployee()
{
}
CHourlyFTEmployee(const char name[], const char id[], float rate, float hours) : CFulltimeEmployee
(name, id)
{
m_rate = rate;
m_hours = hours;
}
float Pay()
{
return m_rate * m_hours - m_benefitcost;
}
};
错误(活动)E0289 没有构造函数的实例
与参数列表匹配CFulltimeEmployee::CFulltimeEmployee
错误 C2664
:无法将参数 1 从CFulltimeEmployee::CFulltimeEmployee(char [], char [])
转换为const char []
Project9char []
编写一个最小的可重现示例实际上并不难;您删除不需要的所有内容,同时仍然演示问题。在这种情况下,可能是:
class CEmployee
{
char m_name[30];
char m_id[30];
virtual float Pay() = 0; // pure virtual function
public:
CEmployee(char name[], char id[])
{
strcpy_s(m_name, name);
strcpy_s(m_id, id);
}
};
struct CFulltimeEmployee : public CEmployee
{
CFulltimeEmployee(char name[], char id[]) : CEmployee(name, id) { }
};
struct CHourlyFTEmployee : public CFulltimeEmployee
{
CHourlyFTEmployee(const char name[], const char id[]) : CFulltimeEmployee(name, id) { }
float Pay() override { return 0.0; }
};
特别注意,不需要
m_benefitcost
、m_rate
或 m_hours
;也不是PrintCheck()
。 (class
默认为 private
,而 struct
为 public
;这也有助于减少噪音。)
一旦完成此操作,就很容易看到编译器抱怨的问题
错误 C2664:“CFulltimeEmployee::CFulltimeEmployee(char [],char [])”:无法将参数 1 从“const char []”转换为“char []”
在
CHourlyFTEmployee
中,您写了 const
char name[]
(和 const char id[]
);但基类 (CFulltimeEmployee
) 是 char name[]
——不是 const
。 const
的数据不能“轻易”分配给非 const
的数据; “修复”很简单:删除 const
:
CHourlyFTEmployee(char name[], char id[]) : CFulltimeEmployee(name, id) { }`
该示例仍然存在其他问题,但听起来您仍受困于现有的
CEmployee
基类。
更好的解决方案是隐藏尽可能多的遗留
CEmployee
类;也许通过引入另一个类CEmployeeNew
(或CEmployee2
);可能看起来像:
struct CEmployeeNew : public CEmployee
{
CEmployeeNew(const std::string& name, const std::string& id) :
CEmployee(const_cast<char*>(name.c_str()), const_cast<char*>(id.c_str())) { }
};