多态性和纯虚函数

时间:2012-12-17 11:07:53

标签: c++ polymorphism

因此,根据以下评论,我想确认此代码是非法的,原因包括:

  1. 我们从抽象类Employee
  2. 创建了一个对象joe
  3. 由于未定义printCheck(),因此它使HourlyEmployee成为像Employee这样的抽象类。因此,我们从一个抽象类中创建了对象joe。
  4. 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();
    }
    

2 个答案:

答案 0 :(得分:2)

什么是非法的:

Employee是一个抽象基类。这一行:

Employee joe;

本身是非法的,它正在创建一个抽象类的实例。

joe = HourlyEmployee();

是一个坏主意,即使这些类都是完整的,因为它会切片。 joe是一个对象,而不是一个引用。

如果HourlyEmployee仍然是抽象的(不实现printCheck())那么你的行当然是非法的,因为你正在创建一个(临时)实例。

顺便说一句,如果两个类都完整,那么编译代码,但printCheck()仍然是虚拟的(不纯),那么

joe.printCheck();

将调用Employee版本而不是HourlyEmployee版本,因为joe属于Employee类型,并且尽管已分配,但仍然如此。这就是为什么切片主要是一个坏主意。

答案 1 :(得分:1)

HourlyEmployee类需要实现基类的printCheck()函数。 实现此功能后,HourlyEmployee是一个可对象的类。