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

标签 c++ virtual-destructor

我获得了一个第三方库及其要使用的 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/

相关文章:

C++ 虚拟析构函数

c++ - C++ 中的虚拟默认析构函数

c++ - 打开文本文件并读取带有空格的字符串,然后将 2 个单独的整数放入结构中

c++ - 如何在 qt creator 中使用从 .h 中预定义的 LinkedStack?

c++ - 跨进程加载 DLL - 如何进行某些操作 "singleton-like"

c++ - VisualStudio 2010 Express 上的 RDTSC - C++ 不支持默认整数

c++ - 不用于删除对象的基类的析构函数应该是虚拟的吗?

oop - 没有虚拟构造函数,而是虚拟析构函数

c++ - c++ 接口(interface)必须遵守五法则吗?

c++ - Hook "smart"元素