构造函数中的虚拟调用

Virtual call in constructor

本文关键字:调用 虚拟 构造函数      更新时间:2023-10-16
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->val(( 的返回值为 1,因为我认为虚拟机制在构造函数中不起作用,但在这里我得到的值为 0,因为 ap->val(( 导致调用 B::val((。为什么?

在此构造函数中

 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 的对象。