如果只有一些派生的 class 是多态的,基 class 析构函数是否需要是虚拟的?

Does base class destructor need to be virtual if only some derived classes are polymorphic?

我遇到了与 类似的情况,我有 2 个 classes 共享一个 public 接口函数,所以我提取了该函数(manage_data_in_memory() 在示例中)输出到基 class 中,2 classes 继承自该基。但是,2 classes 在其他方面不相关,其中一个是多态的,而另一个不是。也不希望有人声明这个基 class 的对象,因为它的存在只是为了防止代码重复(有没有办法强制执行此操作?我知道纯虚函数可以防止对象被实例化,但是声明一个在派生 class 中什么都不做的虚拟纯虚拟似乎是糟糕的设计)。

在这种情况下,基础 class 析构函数是否需要是虚拟的?这将迫使另一个派生的 class 也有一个它不需要的虚拟析构函数。 谢谢

所以现在我的代码形式为

class base  {  // don't instantiate an object of this, is there a way to enforce this?
 public: 
   void manage_data_in_memory();
 protected:
    data;        
 };
    
 class derived : public base
 {
 public:
    void sendData();
 private:
     virtual void sendDataHelper(); // override this in derived classes which need to send custom data in addition to the default data
 };
    
 class derived2 : public base
 { 
  public:
   void do_Z_On_data()
 };

当且仅当派生 class 的实例将通过指向基对象的指针销毁时,基 class 的析构函数必须是虚拟的。如果在这种情况下析构函数不是虚拟的,那么程序的行为将是未定义的。示例:

struct Base {
    // ...
};
struct Derived : Base {};


std::unique_ptr<Base> ptr = std::make_unique<Derived>();
// Base::~Base must be virtual

可以通过使用私有继承来防止 class 的用户这样做(至少是意外地)。如果析构函数不是虚拟的,那么继承应该是私有的,除非在需要标准布局的特殊情况下 class.


is this because private inheritance would make the destructor private

不,私有继承不会使析构函数私有。

which prevents anyone from declaring an object of Base?

不,声明一个 Base 对象不是问题。

私有继承防止从派生指针转换为派生class(和朋友)的成员函数之外的基指针。无法获取指向派生基址的指针 class 将阻止用户通过此类指针删除派生对象。