Скажем, у меня есть следующий интерфейсный класс для «записи в интерфейсы, а не в реализации»:
class IDrawable
{
public:
virtual void
Draw() const = 0;
protected:
~IDrawable() = default;
};
Клиенты не должны иметь возможность удалять динамически размещаемые объекты рисования через указатель интерфейса, поэтому IDrawable
' Деструктор s сделан защищенным и не виртуальным, в соответствии с C ++ Core Guideline C .35: деструктор базового класса должен быть либо publi c и виртуальным, либо защищенным и не виртуальным.
Теперь для класса, который реализует этот интерфейс:
class CDrawable : public IDrawable
{
public:
void
Draw() const override;
};
Это, конечно, выдает предупреждение:
CDrawable
имеет виртуальные функции, но не виртуальный деструктор.
Чтобы решить эту проблему, теперь мы должны добавить виртуальный деструктор к CDrawable
. Но похоже на запах кода, когда в производном классе есть виртуальный деструктор, я раньше такого не видел (?) Разве не имеет смысла иметь виртуальный деструктор в IDrawable
, что противоречит руководству говорит?