2014-01-25 66 views
-2

我有代码,再这样下去C++类的构造函数和析构函数

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

当我运行这段代码,我得到的结果这是这样的

A_'s constructor called

A's constructor called(达至cin.get()程序)

A_'s constructor called

class A_ destructor

我期待A类中创建的对象A_要销毁立即像当main()A_(2)执行的情况下,但它不是发生在这里。

1)为什么A_类的对象,具有A沿创建的:当程序到达端(输入一些文本作为输入后)

class A destructor

class A_ destructor

课题的A_对象仅销毁对象不会立即销毁?

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

+0

你知道继承是什么,它是如何工作的?为了回答你的第二个问题 - 是的,这就是多态性的基础。 – littleadv

+0

@littleadv你说得对,我对继承的理解并不完整,我以为基类的对象是在派生类对象中创建的,我没有想到需要基类构造函数来初始化数据成员派生的形式基类。感谢提示。 – Gautam

回答

0

答案有三个不同的原因。

  1. 以FILO /堆栈顺序调用析构函数(先进先出)。

  2. 范围进场。在你的情况下,唯一的范围是主要功能

  3. 继承。 A继承自A_。

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

然后,因为范围已经结束,所以析构函数按相反顺序调用。 A_(2)被销毁,然后A(1),然后A_A(1)继承自。