补充:(2016.04.05)
上次使用了g++ -fdump-tree-original test3.cpp 命令看到了编译器补充后的函数是什么样子的,但是没有记录,今天补充下:
下文中第一main函数的代码使用如上命名编译后生成一个名为:test3.cpp.003t.original的文件。打开文件查看后会发下编译器给补充的default构造函数和copy函数分别如下图所示:
从图中可以看到,编译器会自动给代码添加默认的构造函数和copy构造函数,同时在此两个构造函数中加入,对 _vptr.shape(指向虚表的,虚指针)赋值,指向Shape类的虚函数表,之所以附带贴上编译器添加的默认构造函数,是为了说明copy构造函数中的虚指针确实是指向Shape类的虚函数表。
在咱们的例子中,当以shape1,shape2作为OutputShape()函数的参数时,由于OutputShape函数定义时的默认参数为Shape类型,而传进去的参数均为Shape类型的子类,此时会隐式调用Shape类的copy构造函数。而copy构造函数是只对成员变量进行拷贝, 虚指针(_vpyr)指向Shape的虚函数表。所以,输出结构就是……。
对下文的第二个main函数的代码使用如上命名编译后生成一个名为:test3.cpp.003t.original的文件。打开文件查看后会发下编译器给补充的default构造函数和copy函数之外,还给默认补充了copy assignment operator【注意,上边的代码中并没有生成copy assignment operator函数,《深入理解C++对象模型》中说