构造函数中的虚拟调用

时间:2016-01-05 18:08:45

标签: c++

class A{
  int i;
  public:
  A():i(0){cout<<" A : "<<i<<endl;}
  A(int a);
    virtual int val(){ return i+1; }

};

class B :public A{
 int i;
  public:
  B():A(),i(0){cout<<" B : "<<i<<endl;}
  B(int a):A(a),i(a) {
  }

  int val(){  return i;}
};

 A::A(int a):i(a){
   cout<<" A ; "<<i<<endl;
   A* ap = new B;
   cout<<" from A "<<ap->val()<<endl; ///expect 1 but got 0;
}

int main(){
  A a(5);
}

我期望调用ap-&gt; val()的返回值为1,因为我认为虚拟机制在构造函数中不起作用,但是这里我的值为0,因为ap-&gt; val()导致调用B :: val()。为什么?

1 个答案:

答案 0 :(得分:2)

在此构造函数中

 A::A(int a):i(a){
   cout<<" A ; "<<i<<endl;
   A* ap = new B;
   cout<<" from A "<<ap->val()<<endl; ///expect 1 but got 0;
}

函数调用ap->val()不适用于正在构造的对象。

在本声明中

   A* ap = new B;

类型B的对象已经使用自己的构造函数调用创建,函数调用应用于已创建的类型B的对象。