class IDrawable
{
public:
virtual void
Draw() const = 0;
protected:
~IDrawable() = default;
};
客户端不应该能够通过接口指针删除动态分配的可绘制对象,因此,根据IDrawable
,C++ Core guideline C.35: A base class destructor should be either public and virtual, or protected and nonvirtual.的析构函数被设置为受保护且非虚拟的>现在是实现该接口的类:
class CDrawable : public IDrawable
{
public:
void
Draw() const override;
};
这当然会发出警告:CDrawable
具有虚拟功能,但非虚拟析构函数。
为了解决这个问题,我们现在必须向CDrawable
添加虚拟析构函数。但是在派生类中有一个虚拟析构函数感觉像是代码的味道,我以前没见过(?)在IDrawable
中有一个虚拟的受保护的析构函数更有意义,这与该准则相反说什么
说我有以下接口类,以便“写入接口,而不是实现”:类IDrawable {public:virtual void Draw()const = 0;保护:〜IDrawable()= ...
CDrawable
具有公共的非虚拟析构函数(隐式定义)。调用它不会导致未定义的行为,除非当然要在从CDrawable
派生的类上调用它。如果您仅引用IDrawable
并调用了它的析构函数,则可以跳过对派生类的破坏(我认为是造成UB),但是由于它不是公共可访问的,所以这不是问题。是,您会收到警告。但是,该警告仅表示存在某些故障。在这种情况下,不是。