2010-01-16 4 views
2
#include <iostream> 
using namespace std; 

class A{ 
public: 
    A() {std::cout<<"A() ";} 
    A(const A& a){cout<<"A(const A&) ";} 
    ~A(){cout<<"~A() ";} 

    virtual void Foo(){cout<<"A::Foo() ";} 
}; 

class B: public A 
{ 
public: 
    B(){std::cout<<"B() ";} 
    B(const B& a){cout<<"B(const B&) ";} 
    ~B(){cout<<"~B() ";} 

    virtual void Foo() {cout<<"B::Foo() ";} 

}; 

int main() 
{ 
    try{ 
     B b; 
     throw b;      //throw like this 
    } 
    catch(A ex){ 
     ex.Foo(); 
    } 
    catch(B ex){ 
     ex.Foo(); 
    } 
    catch(A * ex){ 
     ex->Foo(); 
    } 
    catch(B * ex){ 
     ex->Foo(); 
    } 

    return 0; 
} 

La sortie estquestion de jeter un objet

A() B() A() B (const B &) ~ B() ~ A() A (const A &) A :: foo() ~ A() ~ B() ~ A()

#include <iostream> 
using namespace std; 

class A{ 
public: 
    A() {std::cout<<"A() ";} 
    A(const A& a){cout<<"A(const A&) ";} 
    ~A(){cout<<"~A() ";} 

    virtual void Foo(){cout<<"A::Foo() ";} 
}; 

class B: public A 
{ 
public: 
    B(){std::cout<<"B() ";} 
    B(const B& a){cout<<"B(const B&) ";} 
    ~B(){cout<<"~B() ";} 

    virtual void Foo() {cout<<"B::Foo() ";} 

}; 

int main() 
{ 
    try{ 

     throw B();    //throw it this way 
    } 
    catch(A ex){ 
     ex.Foo(); 
    } 
    catch(B ex){ 
     ex.Foo(); 
    } 
    catch(A * ex){ 
     ex->Foo(); 
    } 
    catch(B * ex){ 
     ex->Foo(); 
    } 

    return 0; 
} 

La sortie est

A() B() A (const A &) A :: foo() ~ A () ~ B() ~ A()

Quelqu'un peut-il m'expliquer la différence? La différence est

A() B (const B &) ~ B() ~ A()

Pourquoi le constructeur de copie de la classe B invoquaient?

Merci beaucoup!

Répondre

4

Parce que dans le premier échantillon de la variable locale b est d'abord être copiées sur la ligne throw, puis découpés en tranches la ligne catch (A ex), alors que dans le second échantillon que la deuxième copie est effectuée.

Je pense que je dois mentionner le mantra throw by value, catch by reference ici :)

+1

alors pourquoi le constructeur de A est appelé en premier avant que le constructeur de copie de classe B? – skydoor

+0

Le constructeur de base est toujours appelé avant l'une des classes dérivées. C'est pourquoi vous ne pouvez pas appeler des fonctions virtuelles (et attendre que le code dérivé s'exécute) dans ctor/dtor de base. –

+0

Étant donné que le constructeur de copie de B ne copie pas explicitement la base, la base est construite par défaut. 'B (const B & a): A (a) {cout <<" B (const B &) ";} 'GCC met en garde à la fois sur ce comportement et que le gestionnaire de A va attraper l'exception avant que le gestionnaire de B ait une chance – UncleBens

Questions connexes