由于从内部构造函数和析构函数中调用虚拟方法的众所周知的问题,我通常会遇到需要在其构造函数之后调用最终安装方法的类,以及在它们之前调用的预先拆分方法析构函数,像这样:
MyObject * obj = new MyObject; obj->Initialize(); // virtual method call,required after ctor for (obj) to run properly [...] obj->AboutToDelete(); // virtual method call,required before dtor for (obj) to clean up properly delete obj;
这是有效的,但它带有风险,呼叫者将在适当的时候忘记调用这些方法之一或两者.
所以问题是:在C中有什么办法可以自动调用这些方法,所以调用者不用记得去调用它们吗? (我猜,没有,但是我以为我会问,反正有一些聪明的方式来做)
解决方法
向C添加后构造函数的主要问题是没有人建立了如何处理后置后构造函数,post-post-post-constructors等.
基本理论是对象具有不变量.这个不变量是由构造函数建立的.一旦建立起来,可以调用该类的方法.通过引入需要后构造函数的设计,您将引入在构造函数运行后类不变量不会建立的情况.因此,允许来自后期构建函数的虚函数的调用同样不安全,并且您立即失去了他们似乎拥有的一个明显的收益.
如你所示(可能没有你意识到),他们不需要:
MyObject * obj = new MyObject; obj->Initialize(); // virtual method call,required after ctor for (obj) to run properly obj->AboutToDelete(); // virtual method call,required before dtor for (obj) to clean up properly delete obj;
我们来看看为什么不需要这些方法.这两个调用可以从MyObject或其基础之一调用虚函数.但是,MyObject :: MyObject()也可以安全地调用这些函数. MyObject :: MyObject()返回后会发生什么,这将使obj-> Initialize()安全.所以obj-> Initialize()是错误的,或者它的调用可以被移动到MyObject :: MyObject().相反的逻辑与obj-> AboutToDelete()相反.最先导出的析构函数将首先运行,它仍然可以调用所有的虚拟函数,包括AboutToDelete().