这是一个问题场景:我有一个 C++ 对象,其中包含一个需要在对象被销毁之前调用的 Cleanup() 虚拟方法。为了做正确的事,这个 Cleanup 方法需要访问完整的对象(包括子类数据),所以我不能只在我自己的类的析构函数开始时调用 Cleanup(),因为当我的类的当调用析构函数时,任何子类的析构函数都已经完成,并且它们可能已经释放了 Cleanup() 需要查看的一些数据。
显而易见的解决方案是要求调用代码在删除对象之前手动调用我的例程:
theObject->Cleanup();
delete theObject;
但是这个解决方案很脆弱,因为迟早有人(可能是我)会忘记调用 Cleanup() 并且会发生坏事。
另一种解决方案是拥有一个实现 pImpl 技术的“持有人”对象来包装类,并在删除对象之前让持有人对象的析构函数调用该对象的 Cleanup();但该解决方案也不是 100% 可取的,因为它使该类与标准 C++ 类的工作方式不同,并且无法在堆栈上或静态分配对象。
所以问题是,是否有一些聪明的技术(在 C++ 或 C++11 中)可以用来告诉编译器在调用第一个子类析构函数之前自动调用我的对象上的指定(可能是虚拟的)方法?
(想想看,自动调用 Init() 方法的类似机制——就在最后一个子类构造函数完成之后——也可能很方便)