我获得了第三方库,其标题可供使用。现在这个库有一个类'Base'。这个类的问题是它没有虚析构函数。现在因为我没有第三方代码,所以我不能在那里进行更改。
我被告知用这个写几个派生类,并确保在删除对象时正确清理对象。我们怎样才能做到这一点?
感谢您的回复,看起来我只有2个选项。
1)将虚拟析构函数放在派生类中 2)使用成分。
我计划采用no方法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
请告诉我这种方法应该没问题吗?
答案 0 :(得分:2)
如果派生类析构函数是public
且非虚拟,那么它意味着第三方的实现者不希望他们的类用于多态继承。
如果您的实现计划有删除基类指针所指向的派生类对象的情况,那么没有virtual
析构函数的基类将导致未定义的行为。
如果您的实施计划没有上述方案,那么您仍然可以从类中派生而没有任何问题。
在第一种情况下,由于你没有这个基类的代码,你无法克服崩溃。您可以做的最好是考虑has-a
关系而不是is-a
关系,并尝试让它为您工作。
答案 1 :(得分:0)
如果Base
析构函数是非虚拟的,如果您必须支持delete
的{{1}},那么您就是运气不好。
否则,到
“确保在删除对象时正确清理对象”
只需在派生类Base*
中添加虚拟析构函数。
但是你确定这个要求确实是“当对象被删除时”吗?因为更好的方法是禁止动态分配。通过使Derived
- 表达式需要的实际上不可用的东西,例如分配函数(例如,限制其可访问性),您可以在代码中执行哪些操作,以及通过仅在文档中说明您可以更轻松地执行哪些操作不支持动态分配。
如果你能弄清楚从new
派生类的目的是什么,可能会有更好的解决方案。也许你不需要类推导。也许你可以使用Base
成员,比如说。