2013-07-11 220 views
0
#include <iostream> 

class A 
{ 
public: 
    A(int n = 2) : m_i(n) { } 
    ~A() { std::cout << m_i; } 
protected: 
    int m_i; 
}; 
class B 
    : public A 
{ 
public: 
    B(int n) : m_x(m_i + 1) , m_a(n) { } 
public: 
    ~B() 
    { 
     std::cout << m_i; 
     --m_i; 
    } 
private: 
    A m_x; 
    A m_a; 
}; 
int main() 
{ 
    { B b(5); } 
    std::cout << std::endl; 
    return 0; 
} 

任何機構可以解釋爲什麼輸出爲2531?調用繼承構造函數/析構函數的順序,C++

我知道繼承的構造函數和析構函數順序,但是類初始化列表呢,爲什麼答案不是2351?

回答

2

讓我們來看看在施工第一順序:

  1. 基地A對象構造與構造(因爲它被聲明第一)與參數的2b.m_i = 2
  2. m_x默認參數3b.m_i + 1
  3. m_a被構造成具有的5
參數

破壞後,事件將以相反的順序發生,除非~B()的主體在上述3個對象中的任何一個被銷燬之前被執行。這打印出領先的2。它也減少b.m_ib.m_i = 1)。

  1. ~b打印2
  2. ~b.m_a打印5
  3. ~b.m_x打印3
  4. A對象被銷燬,打印1