【问题标题】:Virtual call in constructor [duplicate]构造函数中的虚拟调用[重复]
【发布时间】:2016-04-09 16:12:20
【问题描述】:
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()。为什么?

【问题讨论】:

  • 一个; 5 A : 0 B : 0 from A 0 这是跑出来的
  • ap-&gt;val()val 的构造中没有被调用
  • 您使用new B 实例化它,所以它是B 的实例,而不是A。当您调用val() 时,它使用实际类型,而不是声明类型。
  • 投反对票,因为这实际上是一个研究不足的问题。

标签: c++


【解决方案1】:

在这个构造函数中

 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-&gt;val() 未应用于正在构建的对象。

在此声明中

   A* ap = new B;

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

【讨论】:

  • 我明白这一点,所以如果B的对象在A的构造函数中成功创建,虚拟调用机制即使在A的构造函数中也有效?,我虽然在构造函数中它应该默认为本地函数调用?跨度>
  • @shanker861 如果函数调用将应用于正在构建的对象,那么你是对的。
  • 好吧,这是有道理的。
猜你喜欢
  • 2010-10-02
  • 1970-01-01
  • 1970-01-01
  • 2011-07-16
  • 2013-02-18
  • 2013-12-30
  • 2011-03-30
  • 2013-09-06
  • 2022-11-17
相关资源
最近更新 更多