c ++类构造函数和析构函数

时间:2014-01-25 05:19:54

标签: c++ constructor

我的代码是这样的

class A_
 {
  public:
  int k;

  A_(int a):k(a)
  {cout<<"A_'s constructor called"<<endl;  
    }

  virtual   ~A_()
   {
    cout<<"class A_ destructor"<<endl;
    }
 virtual void getval() { cout<<k<<endl;}

};

class A : public A_
 {
  public:
  int m;
  A(int a):A_(2),m(a){cout<<"A's constructor called"<<endl;}
  virtual void getval()
   {
    cout<<"m is "<<m<<endl;
    }
   ~A()
    {
     cout<<"class A destructor"<<endl;
     }
};
int main()
{
  A A1(1);
  A_(2);
  cin.get();
  }

当我运行此代码时,我得到的结果是这样的(程序到达cin.get()

A_'s constructor called

A's constructor called

A_'s constructor called

class A_ destructor

我希望A类中创建的A_对象能够被立即销毁,就像执行A_(2)中的main ()时一样,但是这里没有发生。仅当程序到达结束时(在输入一些文本作为输入后)才销毁A_对象

class A destructor

class A_ destructor

问题:

1)为什么A_类的对象与A对象一起被创建并未立即销毁?

2)当基类的对象调用派生类的方法时是否存在任何情况?特别是A_对象可以调用getval()对象的A吗?

1 个答案:

答案 0 :(得分:0)

答案有三个不同的原因。

  1. 以FILO /堆栈顺序调用析构函数(最后一个)。

  2. 范围发挥作用。在您的实例中,唯一的范围是主要功能

  3. 继承。 A继承自A _。

  4. 如果你考虑一下,为了创建一个类型为“A”的对象,它必须首先知道从“A_”继承什么。因此,首先创建A_,然后创建A.然后,运行您的行“A_(2)”,导致第二次调用A_构造函数。

    然后,由于范围已结束,因此以相反的顺序调用析构函数。 A_(2)被破坏,然后是A(1),然后是A(1)继承的A_。