C++ 虚调用构造函数 A类{ int i; 公众: 此构造函数中的A():i(0){cout

C++ 虚调用构造函数 A类{ int i; 公众: 此构造函数中的A():i(0){cout,c++,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

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);
}

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

A;5 A:0 B:0从A 0开始这将停止运行
ap->val()
val
的构造中没有被调用,您正在用
new B
实例化它,因此它是
B
的一个实例,而不是
A
。当您调用
val()时
,它使用的是实际的类型,而不是声明的类型。向下投票,因为这实际上是一个研究不足的问题。我理解这一点,所以如果B的对象在a的构造函数中成功创建,虚拟调用机制甚至在a的构造函数中也能工作,我认为在构造函数中,如果函数cal我将应用于正在建造的物体,那么你是对的。好的,这是有意义的。
 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;
}
   A* ap = new B;