Not what I expected from some exception code (throw/try/catch)
I was wondering if someone could explain the output I am getting for
the program below. What I expected from the main program output was
"Cat" but instead I see "Mammal". The output is also included below.
I got the same results with GCC 3.4.4 under cygwin as with MSDev
studio 2003. Even stranger to me, if I change the catch statement to
catch a Cat instead of a Mammal, the program crashes in the catch
body, during the call to m.MyType(). Thanks for any explanations in
advance.
Program:
#include <iostream>
using namespace std;
class Mammal
{
public:
Mammal()
{
cout << "Constructing Mammal @ " << this << endl;
}
Mammal(const Mammal& source)
{
cout << "Copy Constructing Mammal @ " << this << " from " <<
&source << endl;
}
~Mammal()
{
cout << "Destructing Mammal @ " << this << endl;
}
virtual const char* MyType()
{
return "Mammal";
}
};
class Cat : public Mammal
{
public:
Cat()
{
cout << "Constructing Cat @ " << this << endl;
}
Cat(const Cat& source)
{
cout << "Copy Constructing Cat @ " << this << " from " <<
&source << endl;
}
~Cat()
{
cout << "Destructing Cat @ " << this << endl;
}
virtual const char* MyType()
{
return "Cat";
}
};
int main(int argc, char *argv[])
{
Cat fluffy;
Mammal &fluffyRef = fluffy;
try
{
throw fluffyRef;
}
catch (Mammal &m)
{
cout << "Caught a " << m.MyType() << endl;
return 0;
}
cout << "Nothing Caught" << endl;
return 0;
}
Output:
Steve@nessus /cygdrive/f/dev/src/TestWorkspace
$ ./TestWorkspace.exe
Constructing Mammal @ 0x22ccc0
Constructing Cat @ 0x22ccc0
Copy Constructing Mammal @ 0xc306d8 from 0x22ccc0
Caught a Mammal
Destructing Mammal @ 0xc306d8
Destructing Cat @ 0x22ccc0
Destructing Mammal @ 0x22ccc0