Problem p02391 (C++) — buggy submission, verdict: Runtime Error

#include <iostream>
#include <stdlib.h>

namespace _ITP_1_2_A {
/**
 * @brief 大小関係を管理する
 */
class RelationshipBase {
public:
  /**
   * @brief デストラクタ
   */
  virtual ~RelationshipBase() {}

public:
  /**
   * @fn void printAnswer(int a, int b)
   * @brief 大小関係を出力する
   * @param[in] a 比較対象
   * @param[in] b 比較対象
   */
  virtual void printAnswer() = 0;
};

class RelationshipGreaterThan final : virtual public RelationshipBase {
public:
  /**
   * @brief デストラクタ
   */
  ~RelationshipGreaterThan() {}

public:
  /**
   * @fn void printAnswer(int a, int b)
   * @brief 大小関係を出力する
   * @param[in] a 比較対象
   * @param[in] b 比較対象
   */
  void printAnswer();
};

class RelationshipLessThan final : virtual public RelationshipBase {
public:
  /**
   * @brief デストラクタ
   */
  ~RelationshipLessThan() {}

public:
  /**
   * @fn void printAnswer(int a, int b)
   * @brief 大小関係を出力する
   * @param[in] a 比較対象
   * @param[in] b 比較対象
   */
  void printAnswer();
};

class RelationshipEqual final : virtual public RelationshipBase {
public:
  /**
   * @brief デストラクタ
   */
  ~RelationshipEqual() {}

public:
  /**
   * @fn void printAnswer(int a, int b)
   * @brief 大小関係を出力する
   * @param[in] a 比較対象
   * @param[in] b 比較対象
   */
  void printAnswer();
};

class ITP1_2_A {
private:
  RelationshipBase *relationship;

public:
  /**
   * @brief コンストラクタ
   */
  ITP1_2_A() : relationship(NULL) {}

  /**
   * @brief デストラクタ
   */
  ~ITP1_2_A() { delete relationship; }

public:
  /**
   * @fn bool execute();
   * @brief ２つの整数を読み込み、その大小関係を出力する
   * @return bool 入力範囲内ならtrueを、そうでなければfalseを返す
   */
  bool execute();

private:
  /**
   * @fn void read()
   * @brief 標準入力から読み込む
   * @param[out] a 入力データ
   * @param[out] b 入力データ
   */
  void read(int &a, int &b);

  /**
   * @fn bool check(int a, int b)
   * @brief 入力範囲チェックを行う
   * @param[in] a 入力データ
   * @param[in] b 入力データ
   * @return bool 入力範囲内ならtrueを、そうでなければfalseを返す
   */
  bool check(int a, int b);

  /**
   * @fn RelationshipBase* createRelationship(int a, int b)
   * @brief 比較オブジェクトを生成する
   * @param[in] a 比較対象
   * @param[in] b 比較対象
   */
  RelationshipBase *createRelationship(int a, int b);
};
} // namespace _ITP_1_2_A

using namespace _ITP_1_2_A;

bool ITP1_2_A::execute() {
  int in_a = 0, in_b = 0;

  read(in_a, in_b);

  if (!check(in_a, in_b))
    return false;

  relationship = createRelationship(in_a, in_b);

  relationship->printAnswer();

  return true;
}

void ITP1_2_A::read(int &a, int &b) {
  std::cin >> a >> b;

  // scanf("%d %d", &a, &b);
}

bool ITP1_2_A::check(int a, int b) {
  if (-1000 > a || 1000 < a || -1000 > b || 1000 < b)
    return false;

  return true;
}

RelationshipBase *ITP1_2_A::createRelationship(int a, int b) {
  int diff = a - b;

  if (0 == diff)
    return new RelationshipEqual;
  else if (0 < diff)
    return new RelationshipGreaterThan;

  return new RelationshipLessThan;
}

void RelationshipGreaterThan::printAnswer() {
  std::cout << "a > b" << std::endl;
  // printf("%s\\n", "a > b");
}

void RelationshipLessThan::printAnswer() {
  std::cout << "a < b" << std::endl;
  // printf("%s\\n", "a < b");
}

void RelationshipEqual::printAnswer() {
  std::cout << "a == b" << std::endl;
  // printf("%s\\n", "a == b");
}

/**
 * @fn int main()
 * @brief エントリーポイント
 */
int main() {
  if (!ITP1_2_A().execute())
    return 1;
}


Error: 1

Fixed submission:

#include <iostream>

/**
 * @brief 大小関係を管理する
 */
class RelationshipBase {
public:
  /**
   * @brief デストラクタ
   */
  virtual ~RelationshipBase() {}

public:
  /**
   * @fn void printAnswer(int a, int b)
   * @brief 大小関係を出力する
   * @param[in] a 比較対象
   * @param[in] b 比較対象
   */
  virtual void printAnswer() = 0;
};

class RelationshipGreaterThan final : public RelationshipBase {
public:
  /**
   * @brief デストラクタ
   */
  ~RelationshipGreaterThan() {}

public:
  /**
   * @fn void printAnswer(int a, int b)
   * @brief 大小関係を出力する
   * @param[in] a 比較対象
   * @param[in] b 比較対象
   */
  void printAnswer();
};

class RelationshipLessThan final : public RelationshipBase {
public:
  /**
   * @brief デストラクタ
   */
  ~RelationshipLessThan() {}

public:
  /**
   * @fn void printAnswer(int a, int b)
   * @brief 大小関係を出力する
   * @param[in] a 比較対象
   * @param[in] b 比較対象
   */
  void printAnswer();
};

class RelationshipEqual final : public RelationshipBase {
public:
  /**
   * @brief デストラクタ
   */
  ~RelationshipEqual() {}

public:
  /**
   * @fn void printAnswer(int a, int b)
   * @brief 大小関係を出力する
   * @param[in] a 比較対象
   * @param[in] b 比較対象
   */
  void printAnswer();
};

class ITP1_2_A {
private:
  RelationshipBase *relationship;

public:
  /**
   * @brief コンストラクタ
   */
  ITP1_2_A() : relationship(NULL) {}

  /**
   * @brief デストラクタ
   */
  ~ITP1_2_A() { delete relationship; }

public:
  /**
   * @fn bool execute();
   * @brief ２つの整数を読み込み、その大小関係を出力する
   * @return bool 入力範囲内ならtrueを、そうでなければfalseを返す
   */
  bool execute();

private:
  /**
   * @fn void read()
   * @brief 標準入力から読み込む
   * @param[out] a 入力データ
   * @param[out] b 入力データ
   */
  void read(int &a, int &b);

  /**
   * @fn bool check(int a, int b)
   * @brief 入力範囲チェックを行う
   * @param[in] a 入力データ
   * @param[in] b 入力データ
   * @return bool 入力範囲内ならtrueを、そうでなければfalseを返す
   */
  bool check(int a, int b);

  /**
   * @fn RelationshipBase* createRelationship(int a, int b)
   * @brief 比較オブジェクトを生成する
   * @param[in] a 比較対象
   * @param[in] b 比較対象
   */
  RelationshipBase *createRelationship(int a, int b);
};

bool ITP1_2_A::execute() {
  int in_a = 0, in_b = 0;

  read(in_a, in_b);

  if (!check(in_a, in_b))
    return false;

  relationship = createRelationship(in_a, in_b);

  relationship->printAnswer();

  return true;
}

void ITP1_2_A::read(int &a, int &b) {
  std::cin >> a >> b;

  // scanf("%d %d", &a, &b);
}

bool ITP1_2_A::check(int a, int b) {
  if (-1000 > a || 1000 < a || -1000 > b || 1000 < b)
    return false;

  return true;
}

RelationshipBase *ITP1_2_A::createRelationship(int a, int b) {
  int diff = a - b;

  if (0 == diff)
    return new RelationshipEqual;
  else if (0 < diff)
    return new RelationshipGreaterThan;

  return new RelationshipLessThan;
}

void RelationshipGreaterThan::printAnswer() {
  std::cout << "a > b" << std::endl;
  // printf("%s\\n", "a > b");
}

void RelationshipLessThan::printAnswer() {
  std::cout << "a < b" << std::endl;
  // printf("%s\\n", "a < b");
}

void RelationshipEqual::printAnswer() {
  std::cout << "a == b" << std::endl;
  // printf("%s\\n", "a == b");
}

/**
 * @fn int main()
 * @brief エントリーポイント
 */
int main() {
  if (ITP1_2_A().execute())
    return 1;
}