您的位置:首页 > 其它

不要在构造函数或析构函数里调用虚函数

2011-01-05 00:13 204 查看
在工作的时候有一次不小心就上了C++这个当,随后又继续看了effective C++,书上内容讲的很不错,所以根据自己的理解记一下,印象更深刻。

我对C++的感觉就是做什么事都需要己有意识,稍微一不留神内存就出问题了,如果不知道C++编译器背后做的事的话,很容易会自以为然地写上一些错误的代码,这也许就是经验丰富自的高手与我这种菜鸟的差别了,呵呵,不过菜鸟也会慢慢成长的。嘿嘿

在书上讲道为什么编译器要这么做,为什么构造与析构都不能调用虚函数,原因其实很简单:当在实例化一个派生类的时候,如果在其父类的构造函数里面有所谓的“虚函数”。大家都知道,实例化子类要优先调用父类的构造函数(没有老爸哪有儿子),然后此时如果父类的构造函数里面调用了所谓的虚函数,那么整个逻辑非常奇怪,因为现在儿子都还没有,你去调用什么?怎么去调用还不存在、还未实例化的事物的方法。而且最重要的一个原因是:一般定义虚函数的主要目的是希望该函数由派生类去实现。我现暂且把虚函数的实现者认定为派生类吧,那么也就是说该虚函数其实就是派生类的一个方法,一个类的方法,难免会用到自己本身的属性,而此时派生类还未实例化,请注意,现在才刚开始在实例化派生类它老爸呢。他老爸才刚出生就想调用到儿子的方法,有点奇怪吧。同理析构函数也是这样,析构函数是由外到里一层层析构的,也就是说会先调用派生类的析构函数,也就是先干掉派生类,如果派生类重写的虚函数里面,有调用到派生类被干掉了的数据,而父类又还真调用了“虚函数”,那可就杯了个具了,所以,编译器那样做其实也挺合理的,他就是在析构与构造的时刻,把自己提权,单在构造或析构的时候,都是以当前构造函数或析构函数的真实所属者来进行操作。这样也防止了刚上面讲的那些可能导致错误的情况。

不过C++的陷阱好多,我还是要多看书多学,看书是好重要D。。特别是好书,嘿嘿
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: