权重域名

已备案域名,老域名交易,高权重域名购买,百度权重域名出售,权重域名买卖,万网已备案老域名注册查询抢注转让,买老域名,二手老域名,鹰潭网站建设

多态方法在构造函数中的行为

作者:zhushican 发布:2014-08-14 分类:建站教程 阅读: 次 0条评论

构造函数的调用顺序也带来了一个有趣的难题。如果构造函数调用了一个动态绑定方法,而这个方法又属于正在创建中的对象,那它会产生什么样的效果呢?如果是普通方法,你猜也可以猜到它会怎么做:由于不制动啊这个对象应该算是基类还是派生类的,因此动态绑定会在运行时进行解析。处于一致性的考虑,你可能认为构造函数也应该这么做。

事实并非完全如此。如果你在构造函数里面调用了动态绑定的方法,那么它会使用那个覆写后的版本。但是这个效果会有些出人意料,因此会称为一些不易排查的bug的藏身之处。

从理论上讲,构造函数的任务就是创建对象(这可不是什么轻而易举的事)。从构造函数的角度来看,对象可能只创建了一半——你只知道基类对象已经初始化了,但是你还不知道它会派生出什么类。但是动态绑定的方法调用,会从外面把手伸进类系。它调用的是派生类的方法。如果你在构造函数里面这么做的话,你就可能调用了一个会访问尚未初始化的成员的方法了——注定会出问题。

要解决构造函数中的问题,要知道初始化的全过程:1、在进行其它工作之前,分配给这个对象的内存会先被初始化为二进制的零。2、先调用构造函数,这时会调用被覆写的方法,这时发现,由于受第一步的影响,变量的值还是零。3、数据成员按照它们声明的顺序进行初始化。调用派生类的构造函数的正文。

这样做有个好处,就是它不会流一堆垃圾,最起码把所有的东西都初始化为零了(无论是哪种类型的,都是零)。这其中也包括用合成嵌进去的对象,这些reference都被设成了null。所以如果你忘了对reference进行初始化,运行的时候就会抛出异常。所有的东西都是零,这样查看输出的时候多少会有点线索。

但是另一方面,你可能回对程序运行的结果大吃一惊。你设计完美无缺,但是程序运行的结果就是那样错得离谱,而且编译器还不报错。(在这种情况下,C++的编译器会有一些比较理性的反映)这类bug很容易会被忽略,而且要花很长的时间发现。

结论就是,一个好的构造函数应该用最少的工作量把对象的状态设置好,而且要尽可能地避免去调用方法。构造函数唯一能安全调用的方法就是基类的final方法。它们不会被覆写,因此也不会产生这种以外的行为。

除非注明,本站所有文章均为 zhushican 原创,转载请注明出处! 标签:多态  方法  构造  函数  行为  
« 上一篇下一篇 »

多态方法在构造函数中的行为:目前有0条评论