-4

したがって、以下のコメントに基づいて、次のような理由でこのコードが違法であることを確認したいと思います。

  1. 抽象クラス Employee からオブジェクト joe を作成しました
  2. printCheck() が定義されていないため、HourlyEmployee は Employee のような抽象クラスになります。したがって、抽象クラスからオブジェクト joe を作成しました。

?

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();
}
4

2 に答える 2

2

違法となるのは次のとおりです。

Employee は抽象基本クラスです。この行:

Employee joe;

それ自体は違法であり、抽象クラスのインスタンスを作成しています。

joe = HourlyEmployee();

クラスが両方とも完全であったとしても、スライスするので悪い考えです。joe はオブジェクトであり、参照ではありません。

HourlyEmployee が抽象のままである (printCheck() を実装していない) 場合、(一時的な) インスタンスを作成しているため、当然、その行は違法です。

ちなみに、両方のクラスが完全である場合、コードはコンパイルされますが、printCheck() は仮想 (純粋ではない) のままでした。

joe.printCheck();

joe のタイプは Employee であり、割り当てにもかかわらずそのままであるため、HourlyEmployee バージョンではなく Employee バージョンを呼び出します。そのため、スライスはほとんど悪い考えです。

于 2012-12-17T11:28:50.077 に答える
1

HourlyEmployee クラスは、基本クラスの printCheck() 関数を実装する必要があります。この関数を実装すると、HourlyEmployee はオブジェクト化可能なクラスになります。

于 2012-12-17T12:13:22.343 に答える