2013-07-11 3 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; 
} 

Tout corps peut-il m'expliquer pourquoi la sortie est 2531?Ordre d'appel pour les constructeurs/destructeurs en héritage, C++

Je comprends que l'ordre de constructeur et de destructeur pour l'héritage, mais qu'en est-il de la liste d'initialisation de classe, pourquoi la réponse n'est pas 2351?

Répondre

2

Regardons à l'ordre de construction d'abord:

  1. la base A objet est construit avec un argument par défaut de 2 (b.m_i = 2)
  2. m_x est construit (car il est déclaré en premier) avec un argument de 3 (b.m_i + 1)
  3. m_a est construit avec un argument de 5

Lors de la destruction, les événements se produisent dans l'ordre inverse, sauf que le corps de ~B() est exécuté avant que l'un des 3 objets ci-dessus ne soit détruit. Ceci imprime le premier 2. Il décrémente également b.m_i (b.m_i = 1).

  1. ~b impressions 2
  2. ~b.m_a imprime 5
  3. ~b.m_x impressions 3
  4. de base
  5. A objet est détruit, l'impression 1