C 类构造函数和破坏者

c++ class constructor and destructor

本文关键字:破坏者 构造函数      更新时间:2023-10-16

我有像这样的代码

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_对象会像执行main ()中的A_(2)一样被立即销毁,但在这里没有发生。A_对象只有在程序达到端时才被破坏(输入某些文本作为输入)

class A destructor

class A_ destructor

问题:

1)为什么A_类的对象与A对象没有立即破坏?

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

答案有三个不同的原因。

  1. 以filo/stack订单调用(首先是最后)。

  2. 范围开始发挥作用。在您的实例中,唯一的范围是主函数

  3. 继承。从_。

  4. 继承

如果您考虑它,为了创建" A"类型的对象,它必须首先知道从" A_"中继承的内容。因此,首先创建A_

然后,由于范围已经结束,因此将击曲线以相反的顺序称为。a_(2)被销毁,然后是a(1),然后是a(1)从。

继承的a_