我获得了一个第三方库及其要使用的 header 。现在这个库有一个类“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
请告诉我这种方法是否可行?
最佳答案
如果派生类析构函数是public
并且是非虚拟的,则意味着第三方的实现者不希望他们的类用于多态继承。
如果您的实现计划有删除基类指针指向的派生类对象的场景,那么没有虚拟
析构函数的基类将导致未定义的行为。
如果您的实现计划没有上述场景,那么您仍然可以毫无问题地从该类派生。
在第一种情况下,由于您没有该基类的代码,因此您无法克服崩溃。您能做的最好的事情就是考虑 has-a
关系,而不是 is-a
关系,并尝试让它为您工作。
关于c++ - 在第三方软件中派生没有虚拟析构函数的类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14088640/