读书人

深度探索C++对象模型之(8)

发布时间: 2013-01-28 11:49:56 作者: rapoo

深度探索C++对象模型之(八)

================================================

如果喜欢,请关注:JellyThink | 思想的果冻

更多原创精彩博文,尽在www.jellythink.com

还可以关注新浪微博:http://weibo.com/u/1887014677

================================================

接着《深度探索C++对象模型之(七)》继续写。

当类中有一个或者多个virtual function时,是不会有浅复制的。编译器在这个时候会干什么?
首先,编译器会生成一个虚拟函数表,内含每一个有作用的virtual function的地址;其次,一个指向virtual function的指针安插在每一个class object中。
以上,对于在建立有虚函数的类的对象时,编译器在干的活。

很显然,如果编译器对于每一个新产生的class object的vptr不能成功而正确地设好其初始值,将导致很可怕的结果。因此,当编译器导入一个vptr到class之中时,该class就不再展现浅复制了,现在,编译器需要合成一个copy constructor以求将vptr适当地初始化。如以下代码:

深度探索C++对象模型之(8)

构造函数中初始化vptr在之前的博文中已经做了讲述,就不说了;将a2 = a1执行,是安全的,函数的调用,执行将能被正确的调用和执行。其实,个人认为,在这种没有继承的情况下,vptr作为类的成员,执行,a2 = a1完全体现出的是浅复制。而不体现深复制的情况下是出现在继承的情况下的。欢迎大家和我讨论。
看下面代码:

总结来说,就是A类的copy constructor会显示设定对象的vptr指向A类的vtbl,而不是直接从右边的class object中将其vptr的值直接拷贝过来。
好了,就此打住,至于虚基类的的情况下,可以以此方法进行分析。不做累述了。

2012/1/16 于东软大连

================================================

如果喜欢,请关注:JellyThink | 思想的果冻

更多原创精彩博文,尽在www.jellythink.com

还可以关注新浪微博:http://weibo.com/u/1887014677

================================================


读书人网 >C++

热点推荐