2

我得到了一个第三方库,其中包含要使用的标头。现在这个库有一个类'Base'。这个类的问题是它没有虚拟析构函数。现在,由于我没有第三方代码,我无法在那里进行更改。

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


谢谢回复,看来我只有2个选项。

1)将虚拟析构函数放在派生类中 2)使用组合。

我打算采用第一种方法。我打算使用带有虚拟析构函数的包装派生类。然后使用这个包装派生类进行进一步的派生。下面是代码。

//++ 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

请让我知道这种方法是否可行?

4

2 回答 2

2

如果派生类析构函数public是非虚拟的,则意味着第三方的实现者不希望他们的类用于多态继承。

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

在第一种情况下,由于您没有此基类的代码,因此您无法克服失败。你能做的最好的就是考虑一段has-a关系而不是is-a关系,并试着让它为你工作。

于 2012-12-30T05:59:52.970 回答
0

使用Base非虚拟的析构函数,如果你必须支持它deleteBase*那么你就不走运了。

否则,到

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

只需在派生类中添加一个虚拟析构函数Derived

但是你确定这个要求真的是“当对象被删除时”吗?因为更好的方法是禁止动态分配。您可以通过使 - 表达式所需的几乎不可用的东西在代码中执行此操作new,例如分配函数(例如,限制其可访问性),并且您可以通过在文档中声明不支持动态分配来更轻松地执行此操作.

如果你能弄清派生类的目的是什么,可能会有更好的解决方案Base。也许你不需要类派生。比如说,也许你可以凑合着找一个Base成员。

于 2012-12-30T06:21:01.820 回答