Classes and class hierarchies
C.126
Абстрактный класс обычно не требует написанного пользователем конструктора
Причина
Абстрактный класс обычно не имеет каких-либо данных для инициализации конструктором.
Пример
class Shape {
public:
// конструктор, написанный пользователем, не требуется в абстрактном базовом классе
virtual Point center() const = 0; // чистая виртуальная
virtual void move(Point to) = 0;
// ... больше чистых виртуальных функций ...
virtual ~Shape() {} // деструктор
};
class Circle : public Shape {
public:
Circle(Point p, int rad); // конструктор в производном классе
Point center() const override { return x; }
};
Исключение
(например, статистические данные, информация отладки и т.д.); такие классы обычно имеют конструкторы. Но будьте осторожны: такие классы также часто требуют виртуального наследования.
- Конструктор базового класса, который выполняет работу, например регистрацию объекта где-то, может требовать конструктора.
- В исключительно редких случаях вы можете найти разумным для абстрактного класса иметь небольшой объем данных, общих для всех производных классов
Применение
Отмечайте абстрактные классы с конструкторами.