C++ 在第三方软件中派生没有虚拟析构函数的类

C++ 在第三方软件中派生没有虚拟析构函数的类,c++,virtual-destructor,C++,Virtual Destructor,我得到了一个第三方库,它的头可以使用。现在这个库有了一个类“Base”。这个类的问题是它没有虚拟析构函数。现在,因为我没有第三方代码,我不能在那里做更改 我被告知用它编写一些派生类,并确保在删除对象时正确清理对象。我们如何才能做到这一点 谢谢你的回复,看起来我只有两个选择 1) 将虚拟析构函数放入派生类中 2) 使用构图 我计划采用1号方法。我计划用一个虚拟析构函数创建包装器派生类。然后使用这个包装器派生类进行进一步的派生。下面是代码 //++ THIRD PARTY HEADER class

我得到了一个第三方库,它的头可以使用。现在这个库有了一个类“Base”。这个类的问题是它没有虚拟析构函数。现在,因为我没有第三方代码,我不能在那里做更改

我被告知用它编写一些派生类,并确保在删除对象时正确清理对象。我们如何才能做到这一点


谢谢你的回复,看起来我只有两个选择

1) 将虚拟析构函数放入派生类中 2) 使用构图

我计划采用1号方法。我计划用一个虚拟析构函数创建包装器派生类。然后使用这个包装器派生类进行进一步的派生。下面是代码

//++ THIRD PARTY HEADER
class base
{
public:
    ~base(){ }
};
//-- THIRD PARTY HEADER



//++ MY CODE
// wrapper polymorphic base.
class polymorphic_base
{
public:    
    virtual ~polymorphic_base() { }
};

class derived1 : polymorphic_base
{
/// derived 1
};

class derived2 : polymorphic_base
{
/// derived 2
}


void foo(polymorphic_base *pb)
{
    // use pb
    // use pb
    delete pb;
}


//-- MY CODE

请告诉我这种方法是否合适?

如果派生类析构函数是公共的且非虚拟的,则意味着第三方的实现者不希望将其类用于多态继承

如果您的实现计划中存在删除基类指针指向的派生类对象的场景,则基类没有
virtual
析构函数将导致未定义的行为。
如果您的实现计划没有上述场景,那么您仍然可以从该类派生,而不会出现任何问题


在第一种情况下,因为您没有这个基类的代码,所以无法克服这个崩溃。最好的办法是考虑一个<代码> HAS-< /Case>关系,而不是<代码> IS-A/COD>关系,并设法使它为您工作。

< P>用<代码> Base<代码>析构函数非虚,如果您必须支持<代码>删除<代码> <代码> BASE*/COD> >那么您就不走运了。 否则,

“确保在删除对象时正确清理对象”

只需将虚拟析构函数添加到派生类
derived

但是你确定需求真的是,字面上的“当对象被删除”吗?因为更好的方法是禁止动态分配。您可以在代码中通过使
新的
表达式需要的东西实际上不可用来实现,例如分配函数(例如,限制其可访问性),您可以通过在文档中声明不支持动态分配来更轻松地实现这一点


如果您能够弄清楚从
Base
派生类的目的,可能会有更好的解决方案。也许您不需要类派生。比如说,也许你可以与
Base
成员相处。

一般来说,你运气不好:如果他们没有虚拟析构函数,这通常意味着库的作者不希望你从他们的类派生。无论如何,您为什么需要派生(而不是,比方说,将实例包含为数据成员?)正在检查:您是否确认
Base
本身它可能不是从某个将析构函数定义为virtual的超基类派生的?谁删除了该实例?@dasblinkenlight可能是您的权利作者不希望派生此类。你说得对,我想我需要改变我的设计,用Base作为构图