【发布时间】:2020-06-07 06:21:44
【问题描述】:
假设我有以下接口类以“写入接口,而不是实现”:
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 中使用虚拟受保护析构函数不是更有意义吗,与指南相反说?
【问题讨论】:
-
这里的问题不在于 C.35 本身。就是编译器和 IsoCppCoreGuidelines 有不同的看法。如果你愿意,你可以尝试
CDrawablefinal并检查编译器是否仍然发出警告。
标签: c++ inheritance interface virtual-functions cpp-core-guidelines