Переопределенная функция не печатает данные базового класса - PullRequest
0 голосов
/ 15 января 2020

У меня проблема с наследованием классов в моем коде. Вот что я делаю: у меня есть два класса, один называется Employee , а второй называется Manager . Сотрудник - это базовый класс, он имеет функцию, которая печатает Визитную карточку , содержащую название компании и функцию name () , которая печатает имя сотрудника. Класс Manager является производным классом и наследуется (publi c: Employee). Когда я пытаюсь распечатать ту же визитку для менеджера, на ней не отображается название, только название компании. В чем может быть проблема? Ниже приведен небольшой фрагмент, во-первых, класса Employee:

class Employee {

public:
  // Constructor
  Employee(const char* name, double salary) : _name(name), _salary(salary) {}
  Employee() : _name(" "), _salary(0) {} // default constructor
  // Accessors
  const char* name() const { return _name.c_str() ; }
  double salary() const { return _salary ; }
  // Modifyers (if needed)
  double set_salary( double salary) { 
      _salary = salary;
      return _salary;
  }

  // Print functions
  void businessCard(ostream& os = cout) const {
    os << "   +------------------+  " << endl
       << "   | ACME Corporation |  " << endl 
       << "   +------------------+  " << endl
       << "   " << name() << endl ;
  }

private:

  string _name ;
  double _salary ;

} ;



и, во-вторых, класса Manager:

class Manager : public Employee {

public:

// Constructors
Manager(const char* name, double salary, set<Employee*>& subordinates) : 
    _name(name), _salary(salary), _subs(subordinates) {}

...

// Accessors
const char* name() const { 
    string name;
    name += _name;
    name += " (Manager)"; 
    return name.c_str() ; 
}

void businessCard(ostream& os = cout) const {
    Employee::businessCard();
}

private:
    string _name ;
    double _salary ;
} ;

Проблема, как мне кажется, заключается в name () function, потому что, если я напишу это явно, он появится на карте, хотя и не наследуется. Кто-нибудь может помочь?

1 Ответ

1 голос
/ 16 января 2020

Когда вы звоните Employee::businessCard();, это вызовет const char* name() const { return _name.c_str() ; } класса Employee. Но ранее во время создания объекта Manager вы не передали имя базовому классу Employee, поэтому оно не задано в классе Employee и вы получили его пустым во время печати. ​​

чтобы это работало, это должно быть что-то вроде

Manager(const char* name, double salary, set<Employee*>& subordinates) : Employee(name,salary), _subs(subordinates)

и удаление _name и _salary переменных-членов из менеджера, так как в этом примере это отрицает цель наследования.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...