面试题1:下面哪个选项的说法是正确的?
A.构造函数不能被重载
B.构造函数不能被覆盖
C.一个构造函数可以返回一个私有的或一个对象的引用
D.构造函数代码执行时是从当前的类层级到它祖先的类面试题2析构函数可以为virtual型,构造函数则不能。那么为什么构造函数不能为虚呢?面试题3:如果虚函数是非常有效的,我们是否可以把每个函数都声称为虚函数?

解决方案 »

  1.   

    1.B
    A、构造函数重载很常见
    C、构造函数是构造自己,返回一个值是什么意思?A a = new A()。如果返回值的话,看起来有点怪异
    D、是从祖先开始到子孙2.virtual用来实现多态。当一个构造函数被调用时,它做的首要的事情之一是初始化它的VPTR。如果构造函数是虚函数,在构造对象时,对象是不存在的,也就没有VPTR,就不能调用构造函数来构造对象。 3.以类似Interface的类的模式来看的话,希望子孙都实现声明的所有的方法,算是有道理。但有些情况需要禁止子孙重写一些方法,例如Add(int a, int b),我希望任何情况下都直接返回a+b。一旦声明为虚函数,就不能达到目的了
      

  2.   

    C++的面试吧第3题补充下,JAVA下默认全是虚函数,用虚函数另外一个问题就是性能,因为运行时确定方法地址,要稍比非虚方法慢
      

  3.   

    第3题补充下:
    因为如果构造函数为虚函数的话,它将在执行期间被构造,而执行期则需要对象已经建立,构造函数所完成的工作就是为了建立合适的对象,因此在没有构建好的对象上不可能执行多态(虚函数的目的就在于实现多态性)的工作。
        在继承体系中,构造的顺序就是从基类到派生类,其目的就在于确保对象能够成功地构建。构造函数同时承担着虚函数表的建立,如果它本身都是虚函数的话,如何确保vtbl的构建成功呢?