В C++ (в отличие от некоторых других языков) нет формального разделения на интерфейсы и абстрактные классы на уровне языка, но есть устоявшиеся паттерны их реализации.
Класс, содержащий хотя бы одну чисто виртуальную функцию:
class AbstractClass {
public:
virtual void mustImplement() = 0; // Чисто виртуальная функция
virtual ```AbstractClass() {} // Виртуальный деструктор
};
Класс, содержащий только чисто виртуальные функции и не имеющий членов-данных:
class Interface {
public:
virtual void method1() = 0;
virtual void method2() = 0;
virtual ```Interface() = default;
};
Характеристика | Абстрактный класс | Интерфейс |
---|---|---|
Члены-данные | Может содержать | Не содержит |
Реализации методов | Может иметь реализованные методы | Только чисто виртуальные функции |
Состояние | Может хранить состояние | Не имеет состояния |
Наследование | Может наследовать от других классов | Обычно "чистый" интерфейс |
Модификаторы доступа | Может иметь protected/private члены | Только public методы |
class AbstractShape {
protected:
Color color; // Общее состояние
public:
virtual double area() const = 0;
void setColor(Color c) { color = c; } // Общая реализация
};
class Drawable {
public:
virtual void draw() const = 0;
virtual ```Drawable() = default;
};
class Serializable {
public:
virtual std::string serialize() const = 0;
virtual ```Serializable() = default;
};
Множественное наследование:
class Concrete : public Interface1, public Interface2 {...};
Техника разделения интерфейса (Interface Segregation Principle):
class Printer {
public:
virtual void print() = 0;
virtual ```Printer() = default;
};
class Scanner {
public:
virtual void scan() = 0;
virtual ```Scanner() = default;
};
Отличие от других языков:
interface
Для интерфейсов:
Для абстрактных классов:
= 0
Главные различия:
В C++: