#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!
alors pourquoi le constructeur de A est appelé en premier avant que le constructeur de copie de classe B? – skydoor
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. –
É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