2016-05-15 13 views
3

Wie lautet die Reihenfolge des Konstruktoraufrufs bei der virtuellen Vererbung in C++?Wie lautet die Reihenfolge des Konstruktoraufrufs in der virtuellen Vererbung?

Für die folgenden zwei Fälle der Mehrfachvererbung;

(I) für den folgenden Code, ohne virtuelle Vererbung;

class a 
{ 
    public: 

     a() 
     { 
      cout<<"\t a"; 
     } 

}; 

class b: public a 
{ 
    public: 
     b() 
     { 
      cout<<"\t b"; 
     } 

}; 

class c: public b 
{ 
    public: 

     c() 
     { 
      cout<<"\t c"; 
     } 

}; 

class d: public c 
{ 
    public: 

     d() 
     { 
      cout<<"\t d"; 
     } 
}; 

class e: public c, public d 
{ 
    public: 

     e() 
     { 
      cout<<"\t e"; 
     } 
}; 

class f: public b, public e 
{ 
    public: 

     f() 
     { 
      cout<<"\t f"; 
     } 
}; 


int main() 
{ 

    f aaa; 

    return 0; 
} 

Die Ausgabe lautet:

 a  b  a  b  c  a  b  c  d  e  f 

(II) Mit virtueller Vererbung der Klasse E:

class a 
{ 
    public: 

     a() 
     { 
      cout<<"\t a"; 
     } 

}; 

class b: public a 
{ 
    public: 
     b() 
     { 
      cout<<"\t b"; 
     } 

}; 

class c: public b 
{ 
    public: 

     c() 
     { 
      cout<<"\t c"; 
     } 

}; 

class d: public c 
{ 
    public: 

     d() 
     { 
      cout<<"\t d"; 
     } 
}; 

class e: public c, public d 
{ 
    public: 

     e() 
     { 
      cout<<"\t e"; 
     } 
}; 

class f: public b, public virtual e 
{ 
    public: 

     f() 
     { 
      cout<<"\t f"; 
     } 
}; 


int main() 
{ 

    f aaa; 

    return 0; 
} 

Die Ausgabe lautet:

 a  b  c  a  b  c  d  e  a  b  f 

Kann jemand erklären, wie die Ausgabe wird in beiden Fällen erhalten? Wie wirkt sich virtuelle Vererbung auf die Konstruktion von Objekten aus?

Antwort

2

Die virtuelle Basisklasse wird zuerst initialisiert, andernfalls werden die direkten Basisklassen in der Reihenfolge von links nach rechts der Basisklasse deklariert.

Für die Klasse f, class f: public b, public e, gibt es keine virtuelle Basisklasse, die direkte Basisklasse b wird zunächst initialisiert werden, dann e. (Reihenfolge von links nach rechts)

Für class f: public b, public virtual e wird zunächst die virtuelle Basisklasse e initialisiert, dann b.

Siehe Initialization order:

1) Wenn der Konstruktor für die meisten abgeleitete Klasse ist, virtuelle Basis Klassen in der Reihenfolge initialisiert werden, in dem sie in zuerst in der Tiefe von links nach rechts Traversal erscheinen der Basisklasse Erklärungen (von links nach rechts bezieht sich auf den Auftritt in Basis-Bezeichner Listen)

2) Dann werden in von links nach rechts, um als sie in Klasse dieser Basis erscheinen direkte Basisklassen initialisiert -Spezifizliste

3) Dann werden nicht statische Datenelemente in der Reihenfolge der Deklaration in der Klassendefinition initialisiert. Schließlich

4), wird der Körper des Konstruktors ausgeführt

Verwandte Themen