I have 3 classes: A, B, and AnotherClass. Where B is derived from A:
class A {
public:
A(){}
virtual void method() {//default action}
};
Then I have a derived class, B:
class B : public A {
public:
B(){}
void method() {//redefine action}
};
And AnotherClass:
class AnotherClass {
public:
AnotherClass(A& a);
A a;
anotherMethod(){ a.method()}
};
AnotherClass :: AnotherClass(A& a) : a(a) //initialization
So, if I construct an object of AnotherClass with an object of B:
B b();
AnotherClass myObj(b);
Keep in mind, since B inherits from A, and AnotherClass accepts an object of A, I am able to successfully pass in a B object as the argument.
And I call:
myObj.anotherMethod();
I expect this to execute anotherMethod(), and when it does, I expect it to call the REDEFINED method() that belongs to B, but instead it calls the default method() defined in A
I was thinking my problem is because I specify the argument of AnotherClass as an object of class A. However, I do not want to change this argument to an object of class B because I also have classes C, D, and E, that also inherit directly from A. So I want to use the base class as the argument type so I am not limited to only being able to pass in a b object. But, I read some older posts on this site and most proposed solutions was to pass the derived object (b) by reference, which I am doing.
Can someone explain why this is happening?