gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 06:52:35 26 4
gpt4 key购买 nike

我得到了一个第三方库及其 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 并且是非虚拟的,那么这意味着第三方的实现者不希望他们的类被用于多态继承。

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

在第一种情况下,由于您没有该基类的代码,因此您无法渡过难关。您能做的最好的事情就是考虑 has-a 关系而不是 is-a 关系,并尝试让它为您工作。

关于c++ - 在第三方软件中派生没有虚拟析构函数的类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14088640/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com