Classes and class hierarchies
C.121
Если базовый класс используется в качестве интерфейса, сделайте его чистым абстрактным классом
Причина
Класс более стабилен (менее хрупкий), если он не содержит данных. Интерфейсы обычно должны состоять полностью из открытых чистых виртуальных функций и стандартного/пустого виртуального деструктора.
Пример
class My_interface {
public:
// ... только чистые виртуальные функции здесь ...
virtual ~My_interface() {} // или =default
};
Пример, плохо
class Goof {
public:
// ... только чистые виртуальные функции здесь ...
// нет виртуального деструктора
};
class Derived : public Goof {
string s;
// ...
};
void use()
{
unique_ptr<Goof> p {new Derived{"here we go"}};
f(p.get()); // использовать Derived через интерфейс Goof
g(p.get()); // использовать Derived через интерфейс Goof
} // утечка
Derived удаляется через его интерфейс Goof, поэтому его string утекает. Дайте Goof виртуальный деструктор и все будет в порядке.
Применение
- Предупреждайте о любом классе, который содержит члены данных и также имеет переопределяемую (не-
final) виртуальную функцию, которая не была унаследована из базового класса.