我想在基类中实现初始化终结器。最简单的方法是为方法提供终结过程。不幸的是,它强制记住始终在最派生的构造函数的末尾调用它 - 对于客户端来说非常糟糕。我想我可以在基类中使用RAII来达到理想的效果,并编写了这样的代码:
#include <iostream>
using namespace std;
struct Base
{
Base()
{
struct Finishializer
{
~Finishializer()
{
cout << "Base::~Finishializer" << endl;
}
} finishializer;
cout << "Base::Base()" << endl;
}
~Base()
{
cout << "Base::~Base()" << endl;
}
};
struct Derived : Base
{
Derived()
{
cout << "Derived::Derived()" << endl;
}
~Derived()
{
cout << "Derived::~Derived()" << endl;
}
};
int main()
{
Derived();
}
然后我意识到构造函数的调用堆栈评估顺序相反。 我的“Finishializer 模式”要求首先调用基本构造函数,然后在基本构造函数末尾调用派生构造函数(作为下一个堆栈帧)。
不幸的是,C++(在我的例子中是 VS2015)以其他方式工作: 它调用派生构造函数,但作为第一条指令,它调用基本构造函数(作为下一个堆栈帧)。
它会产生以下输出:
Base::Base()
Base::~Finishializer
Derived::Derived()
Derived::~Derived()
Base::~Base()
而不是我梦想的:
Base::Base()
Derived::Derived()
Base::~Finishializer
Derived::~Derived()
Base::~Base()
是否有一些充分的理由来评估堆栈,或者也许可以改变它,因为我建议让其实现“终结器”?您知道使用当前 C++ 实现执行此类操作的替代模式吗?
最佳答案
我还没有找到一种方法来使用基类中的某些内容来完成您想做的事情。我发现唯一有效的方法是在最派生类的构造函数中添加代码。就您而言,
Derived::Derived()
{
cout << "Derived::Derived()" << endl;
Finishializer();
}
一旦您决定从 Derived
派生并希望在新的派生类中执行 Finishializer();
的代码,维护就会变得令人头疼。再说一次,我还没有遇到过无需在最派生类中显式添加代码即可工作的设计/实现模式。
关于c++ - 如何在C++中实现初始化终结器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42164250/