I’m slightly ashamed to admit that I just made a discovery about C++ classes that I probably should have realised years ago.
If you have something like
class A { public: virtual void fn() { cout << "I'm A" << endl;} ; } ; class B : public A { public: void fn() { cout << "I'm B" << endl ;} ; } ; void callfn(A a){ a.fn() ; }
it doesn’t do what I expected at all…
For instance, consider the code
A a; B b; callfn(a) ; callfn (b) ;
This compiles just fine – but the output is
I'm A I'm A
!!!!
In fact, you need to be using pointers to get the behaviour I was after
void callfn(A *a){ a->fn() ; } ... A a; B b; callfn(&a) ; callfn (&b) ;
This exhibits the behaviour I was looking for, namely:
I'm A I'm B
It’s probably very obvious why this is the case, but it stumped me for a bit.