Перегруженный конструктор в производном классе

У меня есть базовый класс Manager и производный класс Workerпохоже, что наследование работает правильно — я создал новый объект производного класса, используя его конструктор по умолчанию, и я могу правильно выводить.
но теперь я хочу сделать перегруженный конструктор для производного класса (Worker) и, похоже, произошла ошибка компиляции, я устал искать ответ, но не нашел.
почему компиляция говорит, что Worker не имеет идентификатора, имени и поля зарплаты? Я создал производный класс по книге и создал для него ctors.

Manager заголовок:

#include <string>
#ifndef MANAGER_H
#define MANAGER_H

class Manager
{
public:
Manager (); //ctor
Manager (std::string, std::string, float, int); //overloaded ctor
friend void display (Manager&); //friend function is declared
~Manager (); //dtor
protected:
std::string id;
std::string name;
float salary;
private:
int clearance;
};

Manager каст:

#include <iostream>
#include "Manager.h"#include "Worker.h"
Manager::Manager() //default ctor
{
id = "M000000";
name = "blank";
salary = 0;
clearance = 0;
}

Manager::Manager(std::string t_id, std::string t_name, float wage, int num): id (t_id), name      (t_name), salary(wage), clearance (num)
{
//overloaded ctor
}

Manager::~Manager()
{
//dtor
}

Worker заголовок:

#include <string>
#ifndef Worker_H
#define Worker_H

class Worker: public Manager
{
public:
Worker();
Worker (std::string, std::string, float, int);
~Worker();
friend void display (Worker&); //friend function is declared
protected:
int projects;
private:

};

#endif // Worker_H

Worker каст:

#include <iostream>
#include "Manager.h"#include "Worker.h"
Worker::Worker() //default ctor
{
id = "w000000";
name = " - ";
salary = 0;
projects = 0;

}
Worker::Worker(std::string t_id, std::string t_name, float wage, int num) : id (t_id), name (t_name), salary (wage), projects (num);
{
//ctor
}
Worker::~Worker()
{
//dtor
}

1

Решение

 Worker::Worker(std::string t_id, std::string t_name, float wage, int num) : id (t_id), name (t_name), salary (wage), projects (num)
{
//ctor
}

здесь вы инициализируете идентификатор участника, имя, зарплату и разрешение, определенные в базовом классе. вам нужно передать его конструктору базового класса для инициализации. Вы не можете инициализировать их напрямую.
id, name а также clearance защищены, так что вы можете получить к ним доступ в производном классе, но не можете инициализировать их напрямую, используя список инициализации. либо вы можете initialize inside the constructor или же make a call to base constructor in initialization list,

Worker::Worker(std::string t_id, std::string t_name, float wage, int num):Manager(t_id,t_name,wage,0), projects (num)
{
//ctor
}
1

Другие решения

Производные классы не видят частных членов своего базового класса. Вы должны делегировать конструктор.

0

Ваш Worker Конструкторы должны быть такими:

Worker::Worker() : Manager("w000000", " - ", 0, 0) {}

Worker::Worker(std::string t_id, std::string t_name, float wage, int num) :
Manager(t_id, t_name, wage, num)
{
}
0