andreas.koest...@googlemail.com wrote:
Why does catch (A ex) rather than catch (B &ex) catch the B()
exception object? If I change the catch statement to catch (A &ex) it
doesn't catch B() anymore but catch (B &ex) does.
This might be quite a beginner question but you know, there's no
stupid questions just ....
Thanks Andreas
It's hard to understand what you're saying and what you're asking. I'l=
just say what the code below should do and why:
class A {
public:
A () {
std::cout << "A::A()" << std::endl;
}
virtual void Foo () {
std::cout << "A::Foo()" << std::endl;
}
};
class B : public A {
public:
B () {
std::cout << "B::B()" << std::endl;
}
virtual void Foo () {
std::cout << "B::Foo()" << std::endl;
}
};
int main(int argc, char** argv) {
try {
throw B();
outputs
B::B()
}
catch ( A ex ) { //catch ( A &ex )
ex.Foo ();
outputs A::Foo()
If you replace with the commented code you see B::Foo()
The problem is that you're slicing your exception object. Always throw
by value, catch by reference.
}
catch ( B& ex ) {
ex.Foo ();
This code is simply never hit.
}
Try this:
int main()
{
B b;
A a1 = b;
A & a2 = b;
std::cout << a1.Foo() << std::endl;
std::cout << a2.Foo() << std::endl;
}