这道题的关键是,基类构造函数里面调用了一个虚函数f,那么实际是调的基类的f还是继承累的f呢?<>这本书的条款"Nevel call virtual functions during construction or destruction"有很好的说明,但是书上举例还是不够充分,解释的也不算清楚。因为:
C++的"类"和"对象"只是语言级的概念,C++标准根本就没有规定编译的结果里面也存在对象,这样就能给编译器和优化器以无穷的空间----反过来说,我们不能假设对象真的有物理存在,因为构造函数有可能被内联,甚至release版连对象都优化得没有了,"多态"这个概念也是可以被编译器优化掉的。因此ctor/dtor要调用类内部的虚函数而根本把所谓多态置之脑后。
所以,C++在ctor/dtor当中遇到虚函数调用的时候,直接当成非虚函数调用类内部的版本。这道题调用的是My::f(),输出是1。如果允许在基类构造期间调用继承类的函数,那么该函数需要访问继承类的成员例如指针,可此时继承类还没有构造,指针错误,崩溃了。
【第三题】用VC2008/VC2012/GCC4.7编译下面的代码Release版,输出多少?【第二题】用VC2008/VC2012/GCC4.7编译下面的代码Release版,输出多少?【第二题】用VC2008/VC2012/GCC4.7编译下面的代码Release版,输出多少?【第三题】以下程序的运行结果是什么: