对于接口类,C ++核心准则C35“基类析构函数应该是公共的还是虚拟的,还是受保护的和非虚拟的?”

问题描述 投票:1回答:1
说我有以下接口类,以便“写入接口,而不是实现”:

class IDrawable { public: virtual void Draw() const = 0; protected: ~IDrawable() = default; };

客户端不应该能够通过接口指针删除动态分配的可绘制对象,因此,根据IDrawableC++ 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()= ...

c++ inheritance interface virtual-functions cpp-core-guidelines
1个回答
0
投票
从技术上讲没有问题。您的CDrawable具有公共的非虚拟析构函数(隐式定义)。调用它不会导致未定义的行为,除非当然要在从CDrawable派生的类上调用它。如果您仅引用IDrawable并调用了它的析构函数,则可以跳过对派生类的破坏(我认为是造成UB),但是由于它不是公共可访问的,所以这不是问题。

是,您会收到警告。但是,该警告仅表示存在某些故障。在这种情况下,不是。

© www.soinside.com 2019 - 2024. All rights reserved.