Конструктор абстрактного класса в C++
Абстрактный класс вполне может иметь конструктор и поля, как обычный тип.
Общие данные задают в родителе, а потомок в
списке инициализации вызывает конструктор базы.
Запишем User с именем в конструкторе
и выведем его у Employee:
#include <string>
class User {
public:
virtual ~User() {}
std::string name;
User(std::string name) : name(name) {}
virtual void increaseRevenue(int value) = 0;
};
class Employee : public User {
public:
int salary;
Employee(std::string name, int salary)
: User(name), salary(salary) {}
void increaseRevenue(int value) override {
salary += value;
}
};
Создадим объект класса Employee и выведем имя вместе с окладом:
int main() {
Employee employee("john", 1000);
std::cout << employee.name << "\n";
std::cout << employee.salary << "\n";
return 0;
}
При создании Employee сначала выполняется
конструктор User, затем инициализируются
поля сотрудника. Чистые методы родителя по-прежнему
ждут реализации в потомке, но общее состояние
уже готово к работе.
Сделайте абстрактный класс User
с конструктором, принимающим имя.
Сделайте Employee с конструктором
имени и зарплаты и передайте имя
в конструктор родителя.
Сделайте Student с конструктором
имени и стипендии, передайте имя
в User и реализуйте
increaseRevenue.