我的代码是这样的
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
吗?
答案 0 :(得分:0)
答案有三个不同的原因。
以FILO /堆栈顺序调用析构函数(最后一个)。
范围发挥作用。在您的实例中,唯一的范围是主要功能
继承。 A继承自A _。
如果你考虑一下,为了创建一个类型为“A”的对象,它必须首先知道从“A_”继承什么。因此,首先创建A_,然后创建A.然后,运行您的行“A_(2)”,导致第二次调用A_构造函数。
然后,由于范围已结束,因此以相反的顺序调用析构函数。 A_(2)被破坏,然后是A(1),然后是A(1)继承的A_。