因此,根据以下评论,我想确认此代码是非法的,原因包括:
class Employee
{
public:
Employee();
Employee(const string& theName, const string& theSsn);
string getName() const;
string getSsn() const;
double getNetPay() const;
void setName(const string& newName);
void setSsn(const string& newSsn);
void setNetPay(double newNetPay);
virtual void printCheck() const = 0;
private:
string name;
string ssn;
double netPay;
};
class HourlyEmployee : public Employee
{
public:
HourlyEmployee();
//<Some more legal member function definitions, none of which are
//pure virtual functions.>
private:
double wageRate;
double hours;
};
int main( )
{
Employee joe;
joe = HourlyEmployee();
}
答案 0 :(得分:2)
什么是非法的:
Employee是一个抽象基类。这一行:
Employee joe;
本身是非法的,它正在创建一个抽象类的实例。
joe = HourlyEmployee();
是一个坏主意,即使这些类都是完整的,因为它会切片。 joe是一个对象,而不是一个引用。
如果HourlyEmployee仍然是抽象的(不实现printCheck())那么你的行当然是非法的,因为你正在创建一个(临时)实例。
顺便说一句,如果两个类都完整,那么编译代码,但printCheck()仍然是虚拟的(不纯),那么
joe.printCheck();
将调用Employee版本而不是HourlyEmployee版本,因为joe属于Employee类型,并且尽管已分配,但仍然如此。这就是为什么切片主要是一个坏主意。
答案 1 :(得分:1)
HourlyEmployee类需要实现基类的printCheck()函数。 实现此功能后,HourlyEmployee是一个可对象的类。